Как конвертировать 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 имеет свой набор инструментов.