当前位置:  开发笔记 > 编程语言 > 正文

使用Python将XML转换为JSON?

如何解决《使用Python将XML转换为JSON?》经验,为你挑选了7个好方法。

我已经在网上看到了很多笨拙的XML-> JSON代码,并且与Stack的用户进行了一些交互,我相信这些人群可以比谷歌搜索结果的前几页更有用.

因此,我们正在解析天气预报,我们需要在众多网站上填充天气小部件.我们现在正在研究基于Python的解决方案.

这个public weather.com RSS提要是我们要解析的一个很好的例子(我们的实际weather.com提要包含其他信息,因为它们与他们合作).

简而言之,我们应该如何使用Python将XML转换为JSON?



1> Martin Blech..:

xmltodict(全面披露:我写的)可以帮助你的XML转换为一个字典+列表+弦结构,下面这个"标准".它是基于Expat的,所以它非常快,不需要在内存中加载整个XML树.

拥有该数据结构后,可以将其序列化为JSON:

import xmltodict, json

o = xmltodict.parse(' text text ')
json.dumps(o) # '{"e": {"a": ["text", "text"]}}'



2> Dan Lenski..:

有XML和JSON之间没有"一对一"映射,所以将一个到另一个必然需要的,你想要什么一定的理解的结果.

话虽这么说,Python的标准库有几个用于解析XML的模块(包括DOM,SAX和ElementTree).从Python 2.6开始,json模块中包含了对与JSON进行Python数据结构转换的支持.

所以基础设施就在那里.


xmljson IMHO是开箱即用,支持各种约定的最快方法。https://pypi.org/project/xmljson/

3> S Anand..:

您可以使用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 [
  • 1
  • 2
]

披露:我写了这个库.希望它能帮助未来的搜索者.


这是一个非常酷的库,但请在阅读更多答案之前阅读[如何提供个人开源库?](https://meta.stackexchange.com/q/229085).

4> 小智..:

如果有时候你只得到响应代码而不是所有数据,那么像json parse这样的错误会在那里,所以你需要将它转换为文本

import xmltodict

data = requests.get(url)
xpars = xmltodict.parse(data.text)
json = json.dumps(xpars)
print json 



5> themihai..:

有一种方法可以将基于XML的标记作为JSON传输,允许它无损地转换回原始形式.见http://jsonml.org/.

它是一种JSON的XSLT.我希望你觉得这对你有帮助



6> 小智..:

这是我为此构建的代码.没有解析内容,只是简单的转换.

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()



7> 小智..:

您可能需要查看http://designtheory.org/library/extrep/designdb-1.0.pdf.该项目从一个大型XML文件库的XML到JSON转换开始.在转换中进行了大量研究,并且生成了最简单直观的XML - > JSON映射(在文档的早期描述).总之,将所有内容转换为JSON对象,并将重复块作为对象列表.

对象意味着键/值对(Python中的字典,Java中的hashmap,JavaScript中的对象)

没有映射回XML以获取相同的文档,原因是,未知键/值对是属性还是属性value,因此该信息丢失.

如果你问我,属性是一个黑客入手; 然后他们再次为HTML做得很好.

推荐阅读
依然-狠幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有