Как преобразовать XML в JSON в Python? [дубликат]

63
задан Community 23 May 2017 в 12:09
поделиться

6 ответов

Совет Совиута по 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

26
ответ дан 24 November 2019 в 16:17
поделиться

Я думаю, что формат 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

14
ответ дан Koen Bok 24 November 2019 в 16:17
поделиться

Jacob Smullyan записал утилиту, названную pesterfish, который использует effbot's ElementTree для преобразования XML в JSON.

8
ответ дан Jeff Bauer 24 November 2019 в 16:17
поделиться

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

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

4
ответ дан Soviut 24 November 2019 в 16:17
поделиться

В общем, вы хотите перейти от XML к обычным объектам вашего языка (так как обычно есть разумные инструменты для этого, и это труднее преобразовать) , А затем из Plain Old Object создайте JSON - для этого тоже есть инструменты, и это довольно простая сериализация (поскольку JSON - это «Object Notation», естественное соответствие для сериализации объектов). Я предполагаю, что у Python есть свой набор инструментов.

1
ответ дан 24 November 2019 в 16:17
поделиться

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

https://github.com/hay/xml2json

1
ответ дан 24 November 2019 в 16:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: