今天我们将学习如何在 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是一个重量非常轻的模块。这是此安装的输出:python install xmltodict module这个安装最好的一点是这个模块不依赖于任何其他外部模块,所以它是轻量级的并且避免了任何版本冲突。只是为了演示,在基于 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)))

让我们看看这个程序的输出:python xml to json在这里,我们简单地使用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))

让我们看看这个程序的输出:python xml文件转json在这里,我们使用另一个模块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'])

让我们看看这个程序的输出:python xml to dict因此,标签可以与属性键一起用作键。属性键只需要以@符号为前缀。

支持 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))

让我们看看这个程序的输出:xml 命名空间到 dict 和 json

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

让我们看看这个程序的输出:python json to xml请注意,要使其正常工作,必须提供单个 JSON 密钥。如果我们考虑修改我们的程序以在第一级数据中包含多个 JSON 键,例如:

import xmltodict

student = {
    "name" : "Shubham",
    "marks" : {
        "math" : 92,
        "english" : 99
    },
    "id" : "s387hs3"
}

print(xmltodict.unparse(student, pretty=True))

在这种情况下,我们在根级别有三个键。如果我们尝试解开这种形式的 JSON,我们将面临这个错误:python json to xml unparse error这是因为 xmltodict 需要以第一个键作为根 XML 标记来构造 JSON。这意味着在数据的根级别应该只有一个 JSON 键。

结论

在本课中,我们学习了一个出色的 Python 模块,该模块可用于解析 XML 并将其转换为 JSON,反之亦然。我们还学习了如何使用 xmltodict 模块将 XML 转换为 Dict。参考:API Doc

Logo

学AI,认准AI Studio!GPU算力,限时免费领,邀请好友解锁更多惊喜福利 >>>

更多推荐