Python XML转JSON,XML转Dict
今天我们将学习如何在 python 中将 XML 转换为 JSON 和 XML 转换为 Dict。我们可以使用 pythonxmltodict
模块读取 XML 文件并将其转换为 Dict 或 JSON 数据。我们还可以流式传输大型 XML 文件并将它们转换为 Dictionary。在进入编码部分之前,让我们首先了解为什么需要 XML 转换。
将 XML 转换为 Dict/JSON
XML 文件已慢慢过时,但网络上仍有相当大的系统仍在使用这种格式。 XML 比JSON重,因此,大多数开发人员在他们的应用程序中更喜欢后者。当应用程序需要理解任何来源提供的 XML 时,将其转换为 JSON 可能是一项繁琐的任务。 Python 中的xmltodict
模块使这项任务非常容易执行。
xmltodict 入门
我们可以开始使用xmltodict
模块,但我们需要先安装它。我们将主要使用pip来执行安装。
安装xmltodict模块
以下是我们如何使用Python 包索引 (pip)安装 xmltodict 模块:
pip install xmltodict
这将很快完成,因为xmltodict
是一个重量非常轻的模块。这是此安装的输出:这个安装最好的一点是这个模块不依赖于任何其他外部模块,所以它是轻量级的并且避免了任何版本冲突。只是为了演示,在基于 Debian 的系统上,可以使用
apt
工具轻松安装此模块:
sudo apt install python-xmltodict
另一个优点是这个模块有一个官方 Debian 包。
Python XML 转 JSON
开始尝试此模块的最佳位置是执行它主要执行的操作,执行 XML 到 JSON 的转换。让我们看一个关于如何做到这一点的代码片段:
import xmltodict
import pprint
import json
my_xml = """
<audience>
<id what="attribute">123</id>
<name>Shubham</name>
</audience>
"""
pp = pprint.PrettyPrinter(indent=4)
pp.pprint(json.dumps(xmltodict.parse(my_xml)))
让我们看看这个程序的输出:在这里,我们简单地使用
parse(...)
函数将XML数据转换为JSON,然后我们使用json
模块以更好的格式打印JSON。
将 XML 文件转换为 JSON
将 XML 数据保存在代码本身中既不可能,也不现实。通常,我们将数据保存在数据库或某些文件中。我们也可以直接选择文件并将它们转换为 JSON。让我们看一个代码片段,我们如何使用 XML 文件执行转换:
import xmltodict
import pprint
import json
with open('person.xml') as fd:
doc = xmltodict.parse(fd.read())
pp = pprint.PrettyPrinter(indent=4)
pp.pprint(json.dumps(doc))
让我们看看这个程序的输出:在这里,我们使用另一个模块pprint以格式化的方式打印输出。除此之外,使用
open(...)
函数很简单,我们使用它获取文件描述符,然后将文件解析为 JSON 对象。
Python XML 转字典
正如模块名称所暗示的那样, xmltodict 实际上将我们提供的 XML 数据转换为简单的Python 字典。因此,我们也可以简单地使用字典键访问数据。这是一个示例程序:
import xmltodict
import pprint
import json
my_xml = """
<audience>
<id what="attribute">123</id>
<name>Shubham</name>
</audience>
"""
my_dict = xmltodict.parse(my_xml)
print(my_dict['audience']['id'])
print(my_dict['audience']['id']['@what'])
让我们看看这个程序的输出:因此,标签可以与属性键一起用作键。属性键只需要以
@
符号为前缀。
支持 XML 中的命名空间
在 XML 数据中,我们通常有一组命名空间,这些命名空间定义了 XML 文件提供的数据范围。在转换为 JSON 格式时,这些命名空间也必须以 JSON 格式保留。让我们考虑这个示例 XML 文件:
<root xmlns="https://defaultns.com/"
xmlns:a="https://a.com/">
<audience>
<id what="attribute">123</id>
<name>Shubham</name>
</audience>
</root>
下面是一个示例程序,介绍了如何以 JSON 格式包含 XML 命名空间:
import xmltodict
import pprint
import json
with open('person.xml') as fd:
doc = xmltodict.parse(fd.read(), process_namespaces=True)
pp = pprint.PrettyPrinter(indent=4)
pp.pprint(json.dumps(doc))
让我们看看这个程序的输出:
JSON转XML
虽然从 XML 转换为 JSON 是该模块的主要目标,但 xmltodict 还支持执行反向操作,将 JSON 转换为 XML 格式。我们将在程序本身中提供 JSON 数据。这是一个示例程序:
import xmltodict
student = {
"data" : {
"name" : "Shubham",
"marks" : {
"math" : 92,
"english" : 99
},
"id" : "s387hs3"
}
}
print(xmltodict.unparse(student, pretty=True))
让我们看看这个程序的输出:请注意,要使其正常工作,必须提供单个 JSON 密钥。如果我们考虑修改我们的程序以在第一级数据中包含多个 JSON 键,例如:
import xmltodict
student = {
"name" : "Shubham",
"marks" : {
"math" : 92,
"english" : 99
},
"id" : "s387hs3"
}
print(xmltodict.unparse(student, pretty=True))
在这种情况下,我们在根级别有三个键。如果我们尝试解开这种形式的 JSON,我们将面临这个错误:这是因为 xmltodict 需要以第一个键作为根 XML 标记来构造 JSON。这意味着在数据的根级别应该只有一个 JSON 键。
结论
在本课中,我们学习了一个出色的 Python 模块,该模块可用于解析 XML 并将其转换为 JSON,反之亦然。我们还学习了如何使用 xmltodict 模块将 XML 转换为 Dict。参考:API Doc
更多推荐
所有评论(0)