XML(可扩展标记语言)是一种用于在不同平台和系统之间存储和传输数据的通用格式。作为从事 Web 服务、配置文件或数据传输的 Python 开发人员,您需要知道如何解析 XML 文件。您可以使用 Python 库使 XML 解析变得简单快捷。

本文将介绍在 Python 中解析 XML 的各种方法,包括内置库和外部工具。您将学习如何处理各种大小的 XML 文件、将 XML 转换为字典以及将解析后的数据保存为 CSV 和 JSON。我们还将研究如何使用更宽松的工具解析无效或格式错误的 XML。

让我们深入了解如何在 Python 中解析 XML 的细节。

目录:

  1. 什么是 XML?
  • 为什么使用 XML?
  • 什么是 XML 解析?
  1. 使用 Python 的内置库解析 XML
  • 使用 xml.etree.ElementTree 解析 XML
  • 使用 xml.dom.minidom 解析 XML
  1. 使用外部 XML 解析库
  • 使用 lxml 解析 XML
  • 如何使用 BeautifulSoup 处理格式错误的 XML
  1. 如何在 Python 中将 XML 转换为字典
  • 使用 xmltodict
  • 使用 untangle
  1. 如何保存解析后的 XML 数据
  • 使用 pandas 导出到 CSV
  • 将数据保存为 JSON
  1. 处理大型 XML 文件
  • 使用 iterparse 进行流解析
  1. 总结
  2. 常见问题解答(FAQ)

什么是 XML?

XML,即可扩展标记语言,是一种用于在不同系统之间存储和交换数据的数据格式。它既可供人类阅读,又可供机器阅读,因此常用于 Web 服务、配置文件等。

为什么是 XML?

使用 XML 是因为它是表示复杂数据的一种灵活且有条理的方式。与 CSV 或纯文本不同,XML 允许您创建元素和属性的层次结构,因此更容易理解和操作数据。

以下是 XML 更受青睐的几个原因:

  • 平台独立性:XML 可与任何操作系统和编程语言一起使用。
  • 可扩展性:XML 文件可以包含简单和复杂的数据结构。
  • 可读性:非开发人员也可以阅读和理解 XML。

什么是 XML 解析?

XML 解析是读取和处理 XML 文档以提取数据的过程。在 Python 中,解析 XML 允许您浏览 XML 文档、提取数据并根据需要进行更改。在使用以 XML 为协议的 API 或其他数据交换系统时,这一点尤为重要。

Python 具有内置库和第三方工具来解析 XML 数据,无论是小型配置文件还是大型数据源。在下一节中,我们将了解如何解析 XML 数据。

使用 Python 的内置库解析 XML

Python 具有强大的内置库来处理 XML 数据。这些库允许您解析 XML 文件、提取所需内容并根据需要操作数据。Python 中用于解析 XML 的两个流行库是 xml.etree.ElementTreexml.dom.minidom.

使用以下方式解析 XML xml.etree.ElementTree

xml.etree.ElementTree 是 Python 默认自带的轻量级库。它是 Python 的 XML 解析库,可轻松解析和浏览 XML 文件。

例如,你可以这样使用 ElementTree 解析 XML 字符串:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
进口 xml.etree.元素树 as ET

# 示例 XML 数据
xml_数据 = “”“


无线鼠标
29.99
电子产品


办公椅
89.99
家具


“”“

# 解析 XML 数据
根 = ET.fromstring(xml_data)

# 访问并打印数据
产品展示 in root.findall('产品'):
名称 = 产品.查找(“名称”)。文本
价格 = 产品.查找('价格')。文本
类别 = 产品.查找(“类别”)。文本
打印(f"产品名称: {名称},价格:${价格}, 类别: {类别}")

在此示例中,我们首先导入 ElementTree 模块。我们可以通过使用以下方法解析 XML 字符串来获取 XML 的根元素 fromstring() 方法。然后我们将使用 findall()find() 搜索特定标签或从标签内部提取文本的方法。

使用 xml.dom.minidom 解析 XML

xml.dom.minidom 是另一个使用文档对象模型 (DOM) 来解析和操作 XML 的内置库。它更强大、更灵活,但使用起来可能不如 ElementTree 在某些情况下。

可以使用 minidom 解析相同的 XML 数据,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
from xml.dom.minidom 文件 进口 解析字符串

# 示例 XML 数据
xml_数据 = “”“


无线鼠标
29.99
电子产品


办公椅
89.99
家具


“”“

# 解析 XML 数据
dom = 解析字符串(xml_data)

# 访问并打印数据
产品 = dom.getElementsByTagName('产品')
产品展示 in 产品:
名称 = 产品.getElementsByTagName(“名称”)[0].子节点[0].节点值
价格 = 产品.getElementsByTagName('价格')[0].子节点[0].节点值
类别 = 产品.getElementsByTagName(“类别”)[0].子节点[0].节点值
打印(f"产品名称: {名称},价格:${价格}, 类别: {类别}")

在这个例子中, parseString() 用于将 XML 加载到 DOM 对象中。然后我们使用 getElementsByTagName() 找到了 product, name, pricecategory 元素,以及 childNodes[0].nodeValue 提取文本。 minidom 提供详细的控制,通常效率低于 ElementTree 用于简单的任务。

使用外部 XML 解析库

当您在 Python 中处理 XML 数据时,您可能希望坚持使用内置库来完成简单的任务。另一方面,对于更复杂的要求或更好地处理不正确的 XML,您可能会选择另一个库来获得更多功能和灵活性。在本部分中,我们将讨论两个著名的外部 XML 解析库:lxml 和 BeautifulSoup。

使用 lxml 解析 XML

您还可以使用 xml文件 当您处理 XML 和 HTML 文档时,这是一个非常好的库。它对 XPath 和 XSLT 有很好的支持,因此可以成为一个强大的 XML 处理器。

要开始使用 lxml,您需要安装它。您可以通过 pip 进行安装:

1
pip 安装 lxml

这是一个使用方法的例子 lxml 解析 XML 数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
from xml文件 进口

# 示例 XML 数据
xml_数据 = “”“


无线鼠标
29.99
电子产品


办公椅
89.99
家具


“”“

# 解析 XML 数据
根 = etree.fromstring(xml_data)

# 访问并打印数据
产品展示 in 根.xpath('//产品'):
名称 = 产品.查找(“名称”)。文本
价格 = 产品.查找('价格')。文本
类别 = 产品.查找(“类别”)。文本
打印(f"产品名称: {名称},价格:${价格}, 类别: {类别}")

在这个例子中,我们使用 lxmletree 模块来解析 XML。使用 xpath 方法,您可以编写强大的查询,以便从这个混乱的 XML 结构中进行精确提取。

如何使用 BeautifulSoup 处理格式错误的 XML

美丽汤 通常用于解析 HTML,但它也能很好地处理格式错误的 XML。这使得它成为处理格式可能不正确的 XML 文档的不错选择。

使用 BeautifulSoup 对于 XML 解析,请安装库以及解析器,例如 lxml:

1
pip 安装 beautifulsoup4 lxml

下面是使用 BeautifulSoup 解析 XML 的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
from bs4 进口 美丽汤

# 包含格式错误的元素的 XML 数据示例
xml_数据 = “”“


无线鼠标
29.99
电子产品


办公椅
89.99
家具


“”“

# 解析 XML 数据
汤 = BeautifulSoup(xml_data, ‘lxml-xml’)

# 访问并打印数据
产品展示 in 汤.find_all('产品'):
名称 = 产品.查找(“名称”).get_text()
价格 = 产品.查找('价格').get_text()
类别 = 产品.查找(“类别”).get_text()
打印(f"产品名称: {名称},价格:${价格}, 类别: {类别}")

在这种情况下, BeautifulSoup 帮助解析不完整或损坏的 XML 文档。当您遇到与编写 XML 的常见做法不符的 XML 时,它尤其有用。

在下一部分中,我们将研究如何将 XML 数据转换为 Python 字典以便于更好地操作。

如何在 Python 中将 XML 转换为字典

如果要求编辑或提取其中的某些元素,处理 XML 数据可能会很困难。一种常见的解决方法是将 XML 转换为 Python 字典。字典用于以键值对的形式存储和检索数据,使我们更轻松地处理数据。让我们探索两个用于将 XML 转换为 Python 字典的流行库: xmltodictuntangle.

使用 xmltodict

xmltodict 是一个简单的库,只需几行代码即可将 XML 数据转换为字典。它简化并加快了 XML 数据的处理。

首先,您需要使用 pip 安装该库:

1
pip 安装 xmltodict

这是一个使用方法的例子 xmltodict 将 XML 转换为字典:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
进口 xmltodict

# 示例 XML 数据
xml_数据 = “”“


笔记本
5.99
100


铅笔
0.99
500


“”“

# 将 XML 转换为字典
data_dict = xmltodict.解析(xml_data)

# 访问并打印数据
项目 in 数据字典['店铺']['物品']:
名称 = 项目[“名称”]
价格 = 商品['价格']
数量 = 项目['数量']
打印(f”商品: {名称},价格:${价格}, 数量: {数量}")

在这个例子中, xmltodict.parse() 将 XML 数据转换为 Python 字典,这样您就可以像使用标准字典一样使用它。这使得从 XML 检索和操作数据变得更加容易。

运用 untangle

另一个将 XML 解析为 Python 对象的优秀库是 解开。 不像 xmltodict,将 XML 转换为字典,untangle 将 XML 转换为 Python 对象,您可以通过属性轻松访问这些对象。

首先,使用 pip 安装库:

1
pip 安装 untangle

这是一个使用方法的例子 untangle:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
进口 解开

# 示例 XML 数据
xml_数据 = “”“


笔记本
5.99
100


铅笔
0.99
500


“”“

# 将 XML 解析为 Python 对象
数据 = 解开.解析(xml_data)

# 访问并打印数据
项目 in 数据.存储.项目:
名称 = 项目.名称.cdata
价格 = 商品.价格.cdata
数量 = 商品.数量.cdata
打印(f”商品: {名称},价格:${价格}, 数量: {数量}")

在这个例子中, untangle 将 XML 结构转换为 Python 对象。每个 XML 标签都成为对象的一个​​属性,您可以使用以下方式轻松访问内容 cdata (字符数据)。

接下来,我们将研究如何将解析后的 XML 数据保存为 CSV 或 JSON 等不同格式以供进一步使用。

如何保存解析后的 XML 数据

解析 XML 数据后,通常会将其保存为更熟悉的格式,例如 CSV 或 JSON。这允许您以对大多数应用程序更用户友好的方式保存、交换和分析数据。在本部分中,我们将介绍两种保存解析后的 XML 数据的方法:使用 pandas 将其导出为 CSV 并将其保存为 JSON。

使用以下方式导出到 CSV pandas

CSV(逗号分隔值)文件通常用于存储表格数据。Python 的 pandas 该软件包可以轻松地将解析后的 XML 数据保存到 CSV 文件。首先,请确保已安装 pandas:

1
pip 安装熊猫

以下是使用 pandas 将 XML 数据转换为 CSV 文件的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
进口 xml.etree.元素树 as ET
进口 大熊猫 as pd

# 示例 XML 数据
xml_数据 = “”“


笔记本
5.99
100


铅笔
0.99
500


“”“

# 解析 XML
根 = ET.fromstring(xml_data)

# 提取数据并创建字典列表
数据 = []
项目 in root.findall('物品'):
名称 = 项目.查找(“名称”)。文本
价格 = 商品.查找('价格')。文本
数量 = 项目.查找('数量')。文本
数据.附加({'姓名': 姓名, '价格': 价格, '数量': 数量})

# 将字典列表转换为 pandas DataFrame
df = pd.DataFrame(数据)

# 将 DataFrame 保存为 CSV 文件
df.to_csv('商店商品.csv', 索引=)

打印(“数据已保存至 store_items.csv”)

在这个例子中,我们使用 xml.etree.ElementTree 解析 XML 数据,然后提取相关信息(如 name, pricequantity) 放入字典列表中。 pandas 然后用于创建 DataFrame 并将数据保存到 CSV 文件。

将数据保存为 JSON

JSON(JavaScript 对象表示法)是一种用于 Web 应用程序和 API 的轻量级数据格式。Python 有一个名为 json 的内置模块,可以将解析后的 XML 转换为 JSON。

以下是将 XML 转换为 JSON 并保存到文件的方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
进口 xmltodict
进口 JSON

# 示例 XML 数据
xml_数据 = “”“


笔记本
5.99
100


铅笔
0.99
500


“”“

# 使用 xmltodict 将 XML 转换为字典
data_dict = xmltodict.解析(xml_data)

# 将字典转换为 JSON 并保存到文件
- 打开('商店商品.json', 'w') as json_文件:
json.dump(data_dict,json_file,缩进=4)

打印(“数据已保存至 store_items.json”)

在这个例子中,我们使用 xmltodict 将 XML 转换为字典,然后使用 json 模块将该字典转换为 JSON。JSON 保存到名为 store_items.json.

接下来,我们将介绍如何处理大型 XML 文件。

处理大型 XML 文件

处理大型 XML 文件时,将整个文件加载到内存中可能很慢且效率低下。为了解决这个问题,最好使用内存友好的策略,允许以较小的块处理 XML。一种有效的方法是逐步解析 XML 文件,以减少内存使用量并加快大型数据集的处理时间。

流解析 iterparse

流解析是一种处理大型 XML 文件的有效技术,它通过分块处理文件,而不是一次读取整个文件。Python 的 iterparse 方法允许您在解析 XML 数据时对其进行处理,这使其成为内存中无法容纳的大型 XML 文件的理想选择。

就是这样 iterparse 工作原理:

  1. 解析事件:iterparse,您可以定义“start”或“end”等事件,以在 XML 元素开始或结束时触发操作。这样您就可以控制 XML 各个部分的处理方式和时间。
  2. 内存管理: 处理完每个元素后,您可以将其从内存中清除以最大限度地减少内存使用量,这在处理大型 XML 文件时至关重要。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
进口 xml.etree.元素树 as ET

# 流解析 XML 文件
事件、元素 in ET.iterparse(‘大文件.xml’, 事件=('结尾',)):
if 元素.标签== '产品':
# 提取产品数据
名称 = 元素.find(“名称”)。文本
类别 = 元素.查找(“类别”)。文本
价格 = 元素.查找('价格')。文本
打印(f”产品: {名称}, 类别: {类别}, 价格: {价格}")

# 从内存中清除已处理元素
元素.清除()

此示例处理每个 <product> 逐个删除元素,然后销毁对象以降低内存使用量。在处理包含数千或数百万个元素的 XML 文件时,此方法非常有用。

总结

Python 有多种灵活的工具来处理 XML,例如内置的 xml.etree.ElementTree 以及更高级的外部第三方包,如 lxml 和 BeautifulSoup。Python 可以处理您交给它的任何事情,例如简单的解析、将 XML 转换为字典或处理大型和格式错误的文件。

使用正确的工具,您可以快速解析 XML 并将其格式化为 CSV 或 JSON。使用博客中讨论的方法,您可以轻松地在 Python 中处理 XML 解析。

如需更多类似教程,请关注我们的 新闻。如果您有任何问题或反馈,我们的 支持团队 在这里帮助你。

常见问题解答(FAQ)

问:Python 适合解析 XML 吗?

是的,Python 非常适合解析 XML。它有内置库,如 xml.etree.ElementTree 和 xml.dom.minidom,使 XML 解析变得简单而高效。另一方面,第三方库,如 lxml 和 BeautifulSoup,具有更高级的功能,专门用于处理复杂或格式错误的 XML 数据。

问:用于 XML 解析的最佳 Python 库是什么?

哪个是最好的库取决于个人需求。ElementTree 通常足以处理简单的东西。如果您需要处理格式错误的 XML、提高处理速度等,lxml 或 BeautifulSoup 插件更合适。

问:如何在 Python 中将 XML 转换为字典?

使用类似的库 xmltodict or 解开 轻松将 XML 转换为 Python 字典。这些库提供了一种将 XML 数据转换为 Python 字典的简单方法,使您能够轻松地与数据交互并使用数据。