Как преобразовать 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)
Ответы
Ответ 1
Советский совет для lxml objectify хорош. Со специальным подклассом simplejson вы можете превратить результат объектной обработки lxml в 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
Обратите внимание на то, что точка Koen очень полезна здесь, вышеприведенное решение работает только для вложенного xml и не включает имя корневых элементов. Это может быть исправлено.
Я включил этот класс в суть: http://gist.github.com/345559
Ответ 2
xmltodict (полное раскрытие: я его написал) может помочь вам преобразовать ваш XML в структуру dict + list + string, следуя этому "standard" . Это Expat, поэтому он очень быстрый и не требует загрузки всего дерева XML в память.
Как только у вас будет такая структура данных, вы можете сериализовать ее в JSON:
import xmltodict, json
o = xmltodict.parse('<e> <a>text</a> <a>text</a> </e>')
json.dumps(o) # '{"e": {"a": ["text", "text"]}}'
Ответ 3
Я думаю, что формат 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>
Посмотрите, что я имею в виду?
Изменить: только что нашел эту статью: http://www.xml.com/pub/a/2006/05/31/converting-between-xml-and-json.html
Ответ 4
Jacob Smullyan написал утилиту под названием pesterfish, в которой используется effbot ElementTree для преобразования XML в JSON.
Ответ 5
Одной из возможностей было бы использовать Objectify или ElementTree из lxml module. Более старая версия ElementTree также доступна и в модуле xml.etree python. Любой из них получит ваш xml, преобразованный в объекты Python, который вы затем можете использовать simplejson для сериализации объекта в JSON.
Хотя это может показаться болезненным промежуточным шагом, он начинает иметь больше смысла, когда вы имеете дело с XML и обычными объектами Python.
Ответ 6
В общем, вы хотите перейти от XML к обычным объектам своего языка (поскольку для этого обычно существуют разумные инструменты, и это более сложное преобразование). А затем из Plain Old Object создайте JSON - для этого есть инструменты, и это довольно простая сериализация (поскольку JSON - это "Обозначение объектов", естественное соответствие для сериализации объектов).
Я предполагаю, что у Python есть набор инструментов.
Ответ 7
Я написал небольшую основанную на командной строке Python script на основе pesterfesh, которая делает именно это:
https://github.com/hay/xml2json