如何在Python中将XML转换为JSON?

可能重复:
使用Python将XML转换为JSON吗?

我正在App Engine上进行一些工作,我需要将从远程服务器检索到的XML文档转换为等效的JSON对象。

我正在使用xml.dom.minidom来解析urlfetch返回的XML数据。我还试图使用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)
Geuis asked 2019-10-08T23:24:52Z
7个解决方案
72 votes

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"]}}'
Martin Blech answered 2019-10-08T23:25:55Z
25 votes

Soviut对于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)

请参阅文档字符串以获取用法示例,从本质上讲,您将lxml objectify的结果传递给objectJSONEncoder实例的编码方法

请注意,Koen的观点在这里非常有效,以上解决方案仅适用于简单嵌套的xml,并且不包含根元素的名称。 这可以解决。

我在以下要点中包含了该类:[http://gist.github.com/345559]

Anton I. Sipos answered 2019-10-08T23:25:24Z
14 votes

我认为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]

Koen Bok answered 2019-10-08T23:26:46Z
8 votes

Jacob Smullyan编写了一个名为pesterfish的实用程序,它使用effbot的ElementTree将XML转换为JSON。

Jeff Bauer answered 2019-10-08T23:27:10Z
4 votes

一种可能性是使用lxml模块中的Objectify或ElementTree。 python xml.etree模块中也提供了较旧版本的ElementTree。 这两种方法都会将您的xml转换为Python对象,然后您可以使用simplejson将对象序列化为JSON。

尽管这似乎是一个痛苦的中间步骤,但是当您同时处理XML和普通Python对象时,它就变得更加有意义。

Soviut answered 2019-10-08T23:27:42Z
1 votes

通常,您希望从XML到您语言的常规对象(因为通常有合理的工具可以执行此操作,而且转换起来比较困难)。 然后从Plain Old Object生成JSON -也有用于此的工具,并且它是一个非常简单的序列化(因为JSON是“ Object Notation”,自然适合序列化对象)。我认为Python有其一套工具。

StaxMan answered 2019-10-08T23:28:08Z
1 votes

我编写了一个基于基于pesterfesh的基于命令行的小型Python脚本,该脚本正是这样做的:

[https://github.com/hay/xml2json]

Husky answered 2019-10-08T23:28:39Z
translate from https://stackoverflow.com:/questions/471946/how-to-convert-xml-to-json-in-python