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

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

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

我使用xml.dom.minidom来parsing由urlfetch返回的XML数据。 我也试图使用django.utils.simplejson将parsing的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) 

Soviut对于lxml客观化的build议是很好的。 有了一个特别的子类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对象的结果传递给objectJSONEncoder实例的编码方法

请注意,Koen的观点在这里是非常有效的,上面的解决scheme只适用于简单的嵌套xml,不包括根元素的名称。 这可能是固定的。

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

xmltodict (完全公开:我写了它)可以帮助你转换你的XML到一个字典+列表+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> 

明白了吗?

编辑:刚刚发现这篇文章: http : //www.xml.com/pub/a/2006/05/31/converting-between-xml-and-json.html

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

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

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

一般来说,你想从XML到你的语言的常规对象(因为通常有合理的工具来做到这一点,这是更难转换)。 然后从普通的老对象产生JSON – 也有这个工具,这是一个相当简单的序列化(因为JSON是“对象符号”,自然适合序列化对象)。 我认为Python有它的一套工具。

我写了一个基于pesterfesh的小型基于命令行的Python脚本,它完全是这样的:

https://github.com/hay/xml2json