Python XML转换为JSON,XML转换为Dict

时间:2020-02-23 14:43:41  来源:igfitidea点击:

今天,我们将学习如何在python中将XML转换为JSON,将XML转换为Dict。
我们可以使用pythonxmltodict模块读取XML文件并将其转换为Dict或者JSON数据。
我们还可以流传输大型XML文件并将其转换为Dictionary。
在进入编码部分之前,我们首先要了解为什么需要进行XML转换。

将XML转换为Dict/JSON

XML文件已逐渐过时,但是Web上有相当大的系统仍在使用这种格式。
XML比JSON重,因此,大多数开发人员在其应用程序中更喜欢后者。

当应用程序需要了解任何来源提供的XML时,将其转换为JSON可能是一项繁琐的任务。
Python中的xmltodict模块使此任务非常容易和直接执行。

xmltodict入门

我们可以从xmltodict模块开始,但是我们需要先安装它。
我们将主要使用pip进行安装。

安装xmltodict模块

这是我们如何使用Python Package Index(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(...)函数非常简单,我们使用它获取一个File描述符,然后将文件解析为一个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密钥。