Как конвертировать XML в JSON в Python? [дубликат]
Возможные Дубликаты:
преобразование XML в JSON с помощью Python?
я делаю некоторую работу над App Engine, и мне нужно преобразовать XML-документ, получаемый с удаленного сервера, в эквивалентный объект JSON.
я использую xml.dom.minidom
для анализа XML-данных, возвращаемых urlfetch
. Я также пытаюсь использовать django.utils.simplejson
для преобразования проанализированного XML-документа в JSON. Я совершенно не понимаю, как это сделать соедините их вместе. Ниже приведен код, который я возиться с:
from xml.dom import minidom
from django.utils import simplejson as json
#pseudo code that returns actual xml data as a string from remote server.
result = urlfetch.fetch(url,'','get');
dom = minidom.parseString(result.content)
json = simplejson.load(dom)
self.response.out.write(json)
7 ответов:
советы Soviut для lxml objectify хороши. Специально подкласса пакет, вы можете превратить объективировать результат этот пакет содержит файлы в формате JSON.
import simplejson as json import lxml class objectJSONEncoder(json.JSONEncoder): """A specialized JSON encoder that can handle simple lxml objectify types >>> from lxml import objectify >>> obj = objectify.fromstring("<Book><price>1.50</price><author>W. Shakespeare</author></Book>") >>> objectJSONEncoder().encode(obj) '{"price": 1.5, "author": "W. Shakespeare"}' """ def default(self,o): if isinstance(o, lxml.objectify.IntElement): return int(o) if isinstance(o, lxml.objectify.NumberElement) or isinstance(o, lxml.objectify.FloatElement): return float(o) if isinstance(o, lxml.objectify.ObjectifiedDataElement): return str(o) if hasattr(o, '__dict__'): #For objects with a __dict__, return the encoding of the __dict__ return o.__dict__ return json.JSONEncoder.default(self, o)
см. docstring например использования, по существу вы передаете результат lxml
objectify
к методу кодирования экземпляраobjectJSONEncoder
обратите внимание, что точка Коэна очень справедлива здесь, Решение выше работает только для просто вложенного xml и не включает имя корневых элементов. Это может быть зафиксированный.
Я включил этот класс в суть здесь:http://gist.github.com/345559
xmltodict (полное раскрытие: я написал это) может помочь вам преобразовать XML в структуру dict + list+string, следуя этому "стандартные". Это экспат-based, так что это очень быстро и не нужно загружать все XML-дерево в памяти.
Как только у вас есть эта структура данных, вы можете сериализовать ее в JSON:
import xmltodict, json o = xmltodict.parse('<e> <a>text</a> <a>text</a> </e>') json.dumps(o) # '{"e": {"a": ["text", "text"]}}'
Я думаю, что формат XML может быть настолько разнообразным, что невозможно написать код, который мог бы сделать это без очень строгого определенного формата XML. Вот что я имею в виду:
<persons> <person> <name>Koen Bok</name> <age>26</age> </person> <person> <name>Plutor Heidepeen</name> <age>33</age> </person> </persons>
станет
{'persons': [ {'name': 'Koen Bok', 'age': 26}, {'name': 'Plutor Heidepeen', 'age': 33}] }
но что бы это было:
<persons> <person name="Koen Bok"> <locations name="defaults"> <location long=123 lat=384 /> </locations> </person> </persons>
посмотреть, что я имею в виду?
Edit: только что нашел эту статью:http://www.xml.com/pub/a/2006/05/31/converting-between-xml-and-json.html
Джейкоб Смульян написал утилиту под названием pesterfish который использует effbot в ElementTree для преобразования XML в JSON.
одной из возможностей было бы использовать Objectify или ElementTree из модуль lxml. Более старая версия ElementTree также доступна в xml python.модуль etree, а также. Любой из них преобразует ваш xml в объекты Python, которые затем можно использовать simplejson для сериализации объекта в JSON.
хотя это может показаться болезненным промежуточным шагом, он начинает иметь больше смысла, когда вы имеете дело с обоими XML и нормальный объект Python.
В общем, вы хотите перейти от XML к обычным объектам вашего языка (поскольку обычно для этого есть разумные инструменты, и это сложнее преобразования). А затем из простого старого объекта производят JSON - для этого тоже есть инструменты, и это довольно простая сериализация (поскольку JSON-это "объектная нотация", естественная для сериализации объектов). Я предполагаю, что Python имеет свой набор инструментов.