Как конвертировать 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 ответов

Решение

Совет Совиута для lxml objectify хорош. С помощью специального подкласса simplejson вы можете превратить результат 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)

Посмотрите строку документации для примера использования, по существу, вы передаете результат lxml objectify к методу кодирования экземпляра objectJSONEncoder

Обратите внимание, что точка зрения Коэна здесь очень верна, решение, приведенное выше, работает только для простого вложенного xml и не содержит названия корневых элементов. Это можно исправить.

Я включил этот класс в суть здесь: http://gist.github.com/345559

xmltodict (полное раскрытие: я написал) может помочь вам преобразовать ваш XML в структуру dict+list+string, следуя этому "стандарту". Он основан на Expat, поэтому он очень быстрый и не требует загрузки всего 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>

Видишь, о чем я?

Изменить: только что нашел эту статью: /questions/2062096/drosselirovanie-protsessora-v-c/2062110#2062110

Джейкоб Смуллян написал утилиту под названием pesterfish, которая использует ElementTree от effbot для преобразования XML в JSON.

Одна из возможностей - использовать Objectify или ElementTree из модуля lxml. Более старая версия ElementTree также доступна в модуле python xml.etree. Любой из них преобразует ваш xml в объекты Python, которые затем вы можете использовать simplejson для сериализации объекта в JSON.

Хотя это может показаться болезненным промежуточным этапом, он становится более понятным, когда вы имеете дело как с XML, так и с обычными объектами Python.

В общем, вы хотите перейти от XML к обычным объектам вашего языка (так как обычно есть разумные инструменты для этого, и это более сложное преобразование). And then from Plain Old Object produce JSON -- there are tools for this, too, and it's a quite simple serialization (since JSON is "Object Notation", natural fit for serializing objects). I assume Python has its set of tools.

Я написал небольшой Python-скрипт на основе командной строки, основанный на pesterfesh, который делает именно это:

https://github.com/hay/xml2json

Другие вопросы по тегам