我已经在网上看到了很多笨拙的XML-> JSON代码,并且与Stack的用户进行了一些交互,我相信这些人群可以比谷歌搜索结果的前几页更有用.
因此,我们正在解析天气预报,我们需要在众多网站上填充天气小部件.我们现在正在研究基于Python的解决方案.
这个public weather.com RSS提要是我们要解析的一个很好的例子(我们的实际weather.com提要包含其他信息,因为它们与他们合作).
简而言之,我们应该如何使用Python将XML转换为JSON?
xmltodict(全面披露:我写的)可以帮助你的XML转换为一个字典+列表+弦结构,下面这个"标准".它是基于Expat的,所以它非常快,不需要在内存中加载整个XML树.
拥有该数据结构后,可以将其序列化为JSON:
import xmltodict, json o = xmltodict.parse('text text ') json.dumps(o) # '{"e": {"a": ["text", "text"]}}'
有XML和JSON之间没有"一对一"映射,所以将一个到另一个必然需要的,你想要什么一定的理解做的结果.
话虽这么说,Python的标准库有几个用于解析XML的模块(包括DOM,SAX和ElementTree).从Python 2.6开始,json
模块中包含了对与JSON进行Python数据结构转换的支持.
所以基础设施就在那里.
您可以使用xmljson库使用不同的XML JSON约定进行转换.
例如,这个XML:
text
通过BadgerFish约定翻译成:
{ 'p': { '@id': 1, '$': 'text' } }
并通过GData约定到此(不支持属性):
{ 'p': { '$t': 'text' } }
...并通过Parker约定(不支持属性):
{ 'p': 'text' }
可以使用相同的约定从XML转换为JSON,从JSON转换为XML:
>>> import json, xmljson >>> from lxml.etree import fromstring, tostring >>> xml = fromstring('text
') >>> json.dumps(xmljson.badgerfish.data(xml)) '{"p": {"@id": 1, "$": "text"}}' >>> xmljson.parker.etree({'ul': {'li': [1, 2]}}) # Creates [
披露:我写了这个库.希望它能帮助未来的搜索者.
如果有时候你只得到响应代码而不是所有数据,那么像json parse这样的错误会在那里,所以你需要将它转换为文本
import xmltodict data = requests.get(url) xpars = xmltodict.parse(data.text) json = json.dumps(xpars) print json
有一种方法可以将基于XML的标记作为JSON传输,允许它无损地转换回原始形式.见http://jsonml.org/.
它是一种JSON的XSLT.我希望你觉得这对你有帮助
这是我为此构建的代码.没有解析内容,只是简单的转换.
from xml.dom import minidom import simplejson as json def parse_element(element): dict_data = dict() if element.nodeType == element.TEXT_NODE: dict_data['data'] = element.data if element.nodeType not in [element.TEXT_NODE, element.DOCUMENT_NODE, element.DOCUMENT_TYPE_NODE]: for item in element.attributes.items(): dict_data[item[0]] = item[1] if element.nodeType not in [element.TEXT_NODE, element.DOCUMENT_TYPE_NODE]: for child in element.childNodes: child_name, child_dict = parse_element(child) if child_name in dict_data: try: dict_data[child_name].append(child_dict) except AttributeError: dict_data[child_name] = [dict_data[child_name], child_dict] else: dict_data[child_name] = child_dict return element.nodeName, dict_data if __name__ == '__main__': dom = minidom.parse('data.xml') f = open('data.json', 'w') f.write(json.dumps(parse_element(dom), sort_keys=True, indent=4)) f.close()
您可能需要查看http://designtheory.org/library/extrep/designdb-1.0.pdf.该项目从一个大型XML文件库的XML到JSON转换开始.在转换中进行了大量研究,并且生成了最简单直观的XML - > JSON映射(在文档的早期描述).总之,将所有内容转换为JSON对象,并将重复块作为对象列表.
对象意味着键/值对(Python中的字典,Java中的hashmap,JavaScript中的对象)
没有映射回XML以获取相同的文档,原因是,未知键/值对是属性还是属性
,因此该信息丢失.
如果你问我,属性是一个黑客入手; 然后他们再次为HTML做得很好.