xmltodict(全面披露:我写的)可以帮助你的XML转换为一个字典+列表+弦结构,下面这个"标准".它是基于Expat的,所以它非常快,不需要在内存中加载整个XML树.
拥有该数据结构后,可以将其序列化为JSON:
import xmltodict, json o = xmltodict.parse('text text ') json.dumps(o) # '{"e": {"a": ["text", "text"]}}'
xmltodict似乎有一个"unsarse"方法,现在将执行反向操作 (5认同)
你写过逆?我想,我会对这种动物感兴趣. (3认同)
Anton I. Sip.. 26
Soviut对lxml客体化的建议很好.使用特殊的子类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("") >>> 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) 1.50 W. Shakespeare
有关用法的示例,请参阅docstring,基本上您将lxml的结果传递objectify
给实例的encode方法objectJSONEncoder
请注意,Koen的观点在这里非常有效,上面的解决方案仅适用于简单嵌套的xml,并且不包括根元素的名称.这可以修复.
我在这里列出了这个课程:http://gist.github.com/345559
xmltodict(全面披露:我写的)可以帮助你的XML转换为一个字典+列表+弦结构,下面这个"标准".它是基于Expat的,所以它非常快,不需要在内存中加载整个XML树.
拥有该数据结构后,可以将其序列化为JSON:
import xmltodict, json o = xmltodict.parse('text text ') json.dumps(o) # '{"e": {"a": ["text", "text"]}}'
Soviut对lxml客体化的建议很好.使用特殊的子类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("") >>> 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) 1.50 W. Shakespeare
有关用法的示例,请参阅docstring,基本上您将lxml的结果传递objectify
给实例的encode方法objectJSONEncoder
请注意,Koen的观点在这里非常有效,上面的解决方案仅适用于简单嵌套的xml,并且不包括根元素的名称.这可以修复.
我在这里列出了这个课程:http://gist.github.com/345559
我认为XML格式可以如此多样化,如果没有非常严格的XML格式,就不可能编写可以做到这一点的代码.这就是我的意思:
Koen Bok 26 Plutor Heidepeen 33
会成为
{'persons': [ {'name': 'Koen Bok', 'age': 26}, {'name': 'Plutor Heidepeen', 'age': 33}] }
但这会是什么:
明白了吗?
编辑:刚刚发现这篇文章:http://www.xml.com/pub/a/2006/05/31/converting-between-xml-and-json.html
Jacob Smullyan编写了一个名为pesterfish的实用程序,它使用effbot的ElementTree将XML转换为JSON.