Сегодня мы узнаем, как преобразовать XML в JSON и XML в словарь в Python. Мы можем использовать модуль Python xmltodict
, чтобы прочитать XML-файл и преобразовать его в словарь или данные JSON. Мы также можем потоково обрабатывать большие XML-файлы и преобразовывать их в словарь. Прежде чем перейти к части кодирования, давайте сначала поймем, почему необходимо преобразование XML.
Преобразование XML в словарь/JSON
XML-файлы медленно уходят в прошлое, но все еще существуют крупные системы в Интернете, использующие этот формат. XML тяжелее, чем JSON, и поэтому большинство разработчиков предпочитают последний в своих приложениях. Когда приложениям необходимо понять предоставленный источником XML, преобразование его в JSON может быть трудной задачей. Модуль xmltodict
в Python делает эту задачу чрезвычайно легкой и прямолинейной.
Начало работы с xmltodict
Мы можем начать работу с модуля xmltodict
, но сначала нам нужно установить его. Мы в основном будем использовать pip для выполнения установки.
Установите модуль xmltodict
Вот как мы можем установить модуль xmltodict с использованием Python Package Index (pip):
pip install xmltodict
Это можно сделать быстро, так как xmltodict
– очень легкий модуль. Вот вывод по этой установке: Лучшее в этой установке заключается в том, что этот модуль не зависит от других внешних модулей, поэтому он легкий и избегает конфликтов версий. Просто для демонстрации, на системах на основе Debian этот модуль легко устанавливается с использованием инструмента
apt
:
sudo apt install python-xmltodict
Еще одним плюсом является то, что у этого модуля есть официальный пакет Debian.
Python XML в JSON
Лучшее место для начала использования этого модуля – выполнение операции, для которой он в первую очередь предназначен, а именно, преобразование XML в JSON. Давайте рассмотрим фрагмент кода, показывающий, как это можно сделать:
import xmltodict
import pprint
import json
my_xml = """
<audience>
<id what="attribute">123</id>
<name>Shubham</name>
</audience>
"""
pp = pprint.PrettyPrinter(indent=4)
pp.pprint(json.dumps(xmltodict.parse(my_xml)))
Давайте посмотрим вывод этой программы: Здесь мы просто используем функцию
parse(...)
для преобразования данных XML в JSON, а затем используем модуль json
для вывода JSON в лучшем формате.
Преобразование XML-файла в JSON
Хранение данных XML в самом коде не всегда возможно и не всегда реалистично. Обычно мы храним наши данные либо в базе данных, либо в некоторых файлах. Мы также можем прямо выбирать файлы и преобразовывать их в JSON. Давайте посмотрим на код, как мы можем выполнить преобразование с XML-файлом:
import xmltodict
import pprint
import json
with open('person.xml') as fd:
doc = xmltodict.parse(fd.read())
pp = pprint.PrettyPrinter(indent=4)
pp.pprint(json.dumps(doc))
Давайте посмотрим вывод этой программы: Здесь мы использовали другой модуль pprint для вывода результата в отформатированном виде. Кроме того, использование функции
open(...)
было простым: мы использовали ее для получения дескриптора файла, а затем разбирали файл в объект JSON.
Python XML в словарь
Как уже предполагает само название модуля, xmltodict действительно преобразует предоставленные нами XML-данные просто в обычный словарь Python. Поэтому мы можем легко получить доступ к данным также с помощью ключей словаря. Вот пример программы:
import xmltodict
import pprint
import json
my_xml = """
<audience>
<id what="attribute">123</id>
<name>Shubham</name>
</audience>
"""
my_dict = xmltodict.parse(my_xml)
print(my_dict['audience']['id'])
print(my_dict['audience']['id']['@what'])
Давайте посмотрим на вывод этой программы: Таким образом, теги можно использовать как ключи, а также ключи атрибутов. Ключи атрибутов просто нужно дополнить символом
@
.
Поддержка пространств имен в XML
В XML-данных обычно есть набор пространств имен, которые определяют область действия данных, предоставленных файлом XML. При преобразовании в формат JSON необходимо, чтобы эти пространства имен сохранялись и в формате JSON. Давайте рассмотрим этот пример XML-файла:
<root xmlns="https://defaultns.com/"
xmlns:a="https://a.com/">
<audience>
<id what="attribute">123</id>
<name>Shubham</name>
</audience>
</root>
Вот пример программы, демонстрирующей, как мы можем включить пространства имен XML в формат JSON:
import xmltodict
import pprint
import json
with open('person.xml') as fd:
doc = xmltodict.parse(fd.read(), process_namespaces=True)
pp = pprint.PrettyPrinter(indent=4)
pp.pprint(json.dumps(doc))
Давайте посмотрим на вывод этой программы:
Преобразование JSON в XML
Хотя основной целью этого модуля является преобразование из XML в JSON, xmltodict также поддерживает обратную операцию, преобразование JSON в форму XML. Мы предоставим данные JSON в самой программе. Вот пример программы:
import xmltodict
student = {
"data" : {
"name" : "Shubham",
"marks" : {
"math" : 92,
"english" : 99
},
"id" : "s387hs3"
}
}
print(xmltodict.unparse(student, pretty=True))
Посмотрим на вывод этой программы: Обратите внимание, что указание единственного ключа JSON является необходимым для правильной работы этого. Если мы предположим, что изменяем нашу программу, чтобы содержать несколько ключей JSON на самом первом уровне данных, например:
import xmltodict
student = {
"name" : "Shubham",
"marks" : {
"math" : 92,
"english" : 99
},
"id" : "s387hs3"
}
print(xmltodict.unparse(student, pretty=True))
В этом случае у нас три ключа на корневом уровне. Если мы попытаемся преобразовать эту форму JSON, мы столкнемся с ошибкой: Это происходит потому, что xmltodict должен построить JSON с первым ключом в качестве корневого тега XML. Это означает, что на корневом уровне данных должен быть только один ключ JSON.
Вывод
В этом уроке мы изучили отличный модуль Python, который можно использовать для разбора и преобразования XML в JSON и наоборот. Мы также узнали, как преобразовать XML в словарь с помощью модуля xmltodict. Ссылка: API Doc
Source:
https://www.digitalocean.com/community/tutorials/python-xml-to-json-dict