如何用Python将XML转换为JSON?

226 投票
19 回答
395828 浏览
提问于 2025-04-11 09:28

我在网上看到过不少复杂的把XML转成JSON的代码,和Stack的用户交流了一段时间后,我觉得这群人能提供的帮助比谷歌搜索结果的前几页要多得多。

现在,我们正在解析一个天气信息源,需要在很多网站上填充天气小部件。我们现在在寻找基于Python的解决方案。

这个公开的weather.com的RSS源是我们要解析的一个好例子(我们实际的weather.com源包含了更多信息,因为我们和他们有合作关系)。

简单来说,我们应该如何用Python把XML转换成JSON呢?

19 个回答

37

你可以使用 xmljson 这个库来根据不同的 XML和JSON转换规则 进行转换。

比如说,这段XML:

<p id="1">text</p>

通过 BadgerFish规则 转换后变成了这个:

{
  'p': {
    '@id': 1,
    '$': 'text'
  }
}

而通过 GData规则 转换后变成了这个(属性不被支持):

{
  'p': {
    '$t': 'text'
  }
}

... 还有通过 Parker规则 转换后变成了这个(属性不被支持):

{
  'p': 'text'
}

你可以用相同的规则在XML和JSON之间互相转换:

>>> import json, xmljson
>>> from lxml.etree import fromstring, tostring
>>> xml = fromstring('<p id="1">text</p>')
>>> json.dumps(xmljson.badgerfish.data(xml))
'{"p": {"@id": 1, "$": "text"}}'
>>> xmljson.parker.etree({'ul': {'li': [1, 2]}})
# Creates [<ul><li>1</li><li>2</li></ul>]

说明:我是这个库的作者。希望它能帮助到未来的用户。

375

xmltodict(我自己写的)可以帮助你把XML格式的数据转换成字典、列表和字符串的结构,遵循这个“标准”。它是基于Expat的,所以速度很快,而且不需要把整个XML树都加载到内存中。

一旦你得到了这个数据结构,就可以把它转换成JSON格式:

import xmltodict, json

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

XML和JSON之间并没有一种“完全对应”的关系,所以把它们相互转换时,你需要先搞清楚你想要用结果做什么。

不过,Python的标准库里有几个可以解析XML的模块(比如DOM、SAX和ElementTree)。从Python 2.6开始,json模块也支持将Python的数据结构转换成JSON,反之亦然。

所以,相关的工具和基础设施都是已经准备好的。

撰写回答