Python XML 转 JSON,XML 转 Dict

今天我们将学习如何在Python中将XML转换为JSON和字典。我们可以使用Python的xmltodict模块读取XML文件并将其转换为字典或JSON数据。我们还可以流式处理大型XML文件并将其转换为字典。在进入编码部分之前,让我们首先了解为什么需要进行XML转换。

将XML转换为字典/JSON

XML文件已经逐渐过时,但在Web上仍然存在一些使用这种格式的大型系统。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需要用第一个键构造JSON作为根XML标签。这意味着在数据的根级别只能有一个JSON键。

结论

在本课程中,我们学习了一个出色的Python模块,可用于解析和转换XML到JSON和反之亦然。我们还学习了如何使用xmltodict模块将XML转换为字典。参考:API文档

Source:
https://www.digitalocean.com/community/tutorials/python-xml-to-json-dict