У меня есть программа, которая читает XML-документ из сокета. У меня есть XML-документ, хранящийся в строке, которую я хотел бы преобразовать непосредственно в словарь Python, так же, как это делается в simplejson
библиотеке Django .
Возьмем для примера:
str ="<?xml version="1.0" ?><person><name>john</name><age>20</age></person"
dic_xml = convert_to_dic(str)
Тогда dic_xml
будет выглядеть{'person' : { 'name' : 'john', 'age' : 20 } }
python
xml
json
dictionary
xml-deserialization
user361526
источник
источник
Ответы:
Это отличный модуль, который кто-то создал. Я использовал его несколько раз. http://code.activestate.com/recipes/410469-xml-as-dictionary/
Вот код с сайта на тот случай, если ссылка испортилась.
Пример использования:
// Или, если вы хотите использовать строку XML:
источник
xmltodict
библиотека). Недостатком является то, что вы должны разместить его самостоятельно в своем проекте.cElementTree
, просто измените первую строку на:from xml.etree import cElementTree as ElementTree
xmltodict (полное раскрытие: я его написал) делает именно это:
источник
Следующий фрагмент кода XML-to-Python-dict анализирует сущности, а также атрибуты, следующие этой «спецификации» XML-to-JSON . Это наиболее общее решение для всех случаев XML.
Это используется:
Результат этого примера (согласно указанной выше «спецификации») должен быть:
Не обязательно красиво, но однозначно, и более простые входные данные XML приводят к более простому JSON. :)
Обновить
Если вы хотите сделать обратное , создать строку XML из JSON / dict , вы можете использовать:
источник
d = {t.tag: {k:v[0] if len(v) == 1 else v for k, v in dd.iteritems()}}
наd = { t.tag: dict( (k, v[0] if len(v) == 1 else v) for k, v in dd.iteritems() ) }
cElementTree
илиlxml.etree
. Обратите внимание, что при использовании Python 3 все.iteritems()
должны быть изменены на.items()
(такое же поведение, но ключевое слово изменено с Python 2 на 3).Эта облегченная версия, хотя и не настраиваемая, довольно легко адаптируется по мере необходимости и работает со старыми питонами. Кроме того, это жестко - это означает, что результаты будут одинаковыми независимо от наличия атрибутов.
Так:
Результаты в:
источник
Самые последние версии библиотек PicklingTools (1.3.0 и 1.3.1) поддерживают инструменты для преобразования из XML в Python dict.
Загрузить можно здесь: PicklingTools 1.3.1
Существует довольно много документации для преобразователей здесь : документация подробно описывает все решений и проблем , которые будут возникать при преобразовании между XML и словарями Python (существует целый ряд краевых случаев: атрибуты, списки, анонимные списки, анонимные dicts, eval и т. д., которые не обрабатываются большинством конвертеров). Но в целом конвертеры просты в использовании. Если "example.xml" содержит:
Затем, чтобы преобразовать его в словарь:
Есть инструменты для преобразования как в C ++, так и в Python: C ++ и Python выполняют идентичное преобразование, но C ++ примерно в 60 раз быстрее
источник
Вы можете легко сделать это с помощью lxml. Сначала установите его:
Вот написанная мной рекурсивная функция, которая делает за вас всю тяжелую работу:
Следующий вариант сохраняет родительский ключ / элемент:
Если вы хотите только вернуть поддерево и преобразовать его в dict, вы можете использовать Element.find (), чтобы получить поддерево, а затем преобразовать его:
См. Документацию lxml здесь . Надеюсь, это поможет!
источник
Заявление об ограничении ответственности: этот модифицированный синтаксический анализатор XML был вдохновлен Адамом Кларком . Исходный синтаксический анализатор XML работает в большинстве простых случаев. Однако для некоторых сложных XML-файлов это не сработало. Я отлаживал код построчно и наконец исправил некоторые проблемы. Если вы обнаружите какие-то ошибки, дайте мне знать. Рад исправить.
источник
источник
Самым простым в использовании парсером XML для Python является ElementTree (начиная с версии 2.5x и выше он находится в стандартной библиотеке xml.etree.ElementTree). Я не думаю, что есть что-то, что делает именно то, что вы хотите из коробки. Было бы довольно тривиально написать что-то, чтобы делать то, что вы хотите, с помощью ElementTree, но зачем преобразовывать в словарь и почему просто не использовать ElementTree напрямую.
источник
Код из http://code.activestate.com/recipes/410469-xml-as-dictionary/ работает хорошо, но если в данном месте иерархии есть несколько одинаковых элементов, он просто переопределяет их.
Я добавил между ними прокладку, которая проверяет, существует ли уже элемент до self.update (). Если да, то выскакивает существующая запись и создает списки из существующих и новых. Любые последующие дубликаты добавляются в список.
Не уверен, можно ли с этим справиться более изящно, но это работает:
источник
Из ответа @ K3 --- rnc (лучший для меня) я добавил небольшие изменения, чтобы получить OrderedDict из текста XML (иногда порядок имеет значение):
Следуя примеру @ K3 --- rnc, вы можете использовать его:
Надеюсь, поможет ;)
источник
Вот ссылка на решение ActiveState - и код на случай, если он снова исчезнет.
источник
В какой-то момент мне пришлось проанализировать и написать XML, который состоял только из элементов без атрибутов, так что отображение 1: 1 из XML в dict было легко. Вот что я придумал на случай, если кому-то еще атрибуты не нужны:
источник
@dibrovsd: решение не сработает, если в xml есть более одного тега с одинаковым именем
По вашему мнению, я немного изменил код и написал его для общего узла вместо root:
источник
Я изменил один из ответов на свой вкус и для работы с несколькими значениями с одним и тем же тегом, например, рассмотрим следующий xml-код, сохраненный в файле XML.xml
и в питоне
выход
источник
У меня есть рекурсивный метод получения словаря из элемента lxml
источник