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

时间:2009-01-23 05:12:30

标签: python xml json

  

可能重复:
  Converting XML to JSON using Python?

我在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)

7 个答案:

答案 0 :(得分:73)

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"]}}'

答案 1 :(得分:25)

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

有关用法的示例,请参阅docstring,基本上您将lxml objectify的结果传递给objectJSONEncoder的实例的编码方法

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

我在这里列出了这个课程:http://gist.github.com/345559

答案 2 :(得分:14)

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

答案 3 :(得分:8)

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

答案 4 :(得分:4)

一种可能性是使用lxml module中的Objectify或ElementTree。旧版本的ElementTree也可以在python xml.etree模块中使用。这些中的任何一个都会将您的xml转换为Python对象,然后您可以使用simplejson将对象序列化为JSON。

虽然这看起来像是一个痛苦的中间步骤,但当你处理XML 普通的Python对象时,它开始变得更有意义。

答案 5 :(得分:1)

通常,您希望从XML转换为您的语言的常规对象(因为通常有合理的工具来执行此操作,而且转换更难)。然后从Plain Old Object生成JSON - 也有这样的工具,它是一个非常简单的序列化(因为JSON是“Object Notation”,自然适合序列化对象)。 我假设Python有一套工具。

答案 6 :(得分:1)

我写了一个基于pesterfesh的基于命令行的Python脚本,它完全按照以下方式执行:

https://github.com/hay/xml2json