目录
1. 使用 xml.etree.ElementTree 解析 XML
在 Python 3 中,解析 XML(可扩展标记语言)文档是一个常见的需求,尤其是在处理 Web 服务、配置文件或其他结构化数据时。Python 提供了多种内置库来解析 XML 文档,包括 xml.etree.ElementTree
(简称 ElementTree
),xml.dom.minidom
(简称 minidom
),以及第三方库如 lxml
。
下面将详细介绍如何使用 Python 的内置库 ElementTree
和 minidom
来解析 XML 文档,并给出一些示例。
1. 使用 xml.etree.ElementTree
解析 XML
ElementTree
是 Python 的标准库之一,它提供了一个轻量级且高效的 XML API。使用 ElementTree
可以方便地解析 XML 文档,并对其进行查询和修改。
1.1 解析 XML 文件
python
深色版本
1import xml.etree.ElementTree as ET
2
3# 解析 XML 文件
4tree = ET.parse('example.xml')
5root = tree.getroot()
6
7# 打印根节点的标签名
8print(root.tag) # 输出 "root"
1.2 创建 XML 文档
python
深色版本
1# 创建 XML 文档
2root = ET.Element("root")
3child1 = ET.SubElement(root, "child1")
4child2 = ET.SubElement(root, "child2")
5ET.SubElement(child2, "subchild")
6
7# 将 XML 文档转换为字符串
8tree = ET.ElementTree(root)
9tree.write("output.xml")
1.3 查询 XML 文档
python
深色版本
1# 查询 XML 文档中的元素
2for elem in root:
3 print(elem.tag, elem.attrib)
4
5# 查找具有特定属性的元素
6for elem in root.iterfind('.//child[@attr="value"]'):
7 print(elem.text)
8
9# 查找所有的 child 元素
10for elem in root.findall('child'):
11 print(elem.tag)
12
13# 查找所有的子元素,包括子元素的子元素
14for elem in root.iter('subchild'):
15 print(elem.tag)
1.4 修改 XML 文档
python
深色版本
1# 修改元素的文本
2root.find('child').text = "modified text"
3
4# 修改元素的属性
5root.find('child').set('attr', 'new_value')
6
7# 删除元素
8root.remove(root.find('child'))
1.5 保存修改后的 XML 文档
python
深色版本
1tree = ET.ElementTree(root)
2tree.write("output.xml")
2. 使用 xml.dom.minidom
解析 XML
minidom
是 Python 的另一个标准库,它基于 DOM(文档对象模型)规范。DOM 是一种将 XML 文档表示为树结构的方法,其中每个节点都是一个对象。
2.1 解析 XML 文件
python
深色版本
1from xml.dom import minidom
2
3# 解析 XML 文件
4doc = minidom.parse('example.xml')
5root = doc.documentElement
6
7# 打印根节点的标签名
8print(root.tagName) # 输出 "root"
2.2 创建 XML 文档
python
深色版本
1# 创建 XML 文档
2doc = minidom.Document()
3root = doc.createElement("root")
4doc.appendChild(root)
5
6child1 = doc.createElement("child1")
7root.appendChild(child1)
8
9child2 = doc.createElement("child2")
10root.appendChild(child2)
11
12subchild = doc.createElement("subchild")
13child2.appendChild(subchild)
14
15# 将 XML 文档转换为字符串
16xml_str = doc.toprettyxml(indent=" ")
17with open("output.xml", "w") as f:
18 f.write(xml_str)
2.3 查询 XML 文档
python
深色版本
1# 查询 XML 文档中的元素
2for node in root.childNodes:
3 if node.nodeType == node.ELEMENT_NODE:
4 print(node.tagName, node.attributes.items())
5
6# 查找具有特定属性的元素
7elements = doc.getElementsByTagName("child")
8for element in elements:
9 if element.getAttribute("attr") == "value":
10 print(element.firstChild.nodeValue)
11
12# 查找所有的 child 元素
13elements = doc.getElementsByTagName("child")
14for element in elements:
15 print(element.tagName)
16
17# 查找所有的子元素,包括子元素的子元素
18elements = doc.getElementsByTagName("subchild")
19for element in elements:
20 print(element.tagName)
2.4 修改 XML 文档
python
深色版本
1# 修改元素的文本
2element = doc.getElementsByTagName("child")[0]
3element.firstChild.nodeValue = "modified text"
4
5# 修改元素的属性
6element.setAttribute("attr", "new_value")
7
8# 删除元素
9root.removeChild(element)
2.5 保存修改后的 XML 文档
python
深色版本
1xml_str = doc.toprettyxml(indent=" ")
2with open("output.xml", "w") as f:
3 f.write(xml_str)
3. 使用第三方库 lxml
lxml
是一个强大的第三方库,它提供了比 ElementTree
更多的功能,支持 XPath 表达式,并且性能更好。lxml
的使用方法与 ElementTree
类似,但提供了更多的灵活性。
3.1 安装 lxml
bash
深色版本
1pip install lxml
3.2 解析 XML 文件
python
深色版本
1from lxml import etree
2
3# 解析 XML 文件
4tree = etree.parse('example.xml')
5root = tree.getroot()
6
7# 打印根节点的标签名
8print(root.tag) # 输出 "root"
3.3 使用 XPath 查询 XML 文档
python
深色版本
1# 查询 XML 文档中的元素
2for elem in root.xpath('.//child'):
3 print(elem.tag)
4
5# 查找具有特定属性的元素
6for elem in root.xpath('.//child[@attr="value"]'):
7 print(elem.text)
8
9# 查找所有的子元素,包括子元素的子元素
10for elem in root.xpath('.//subchild'):
11 print(elem.tag)
总结
在 Python 中,解析 XML 文档可以通过多种方式实现,其中最常用的有 ElementTree
、minidom
和 lxml
。ElementTree
是一个轻量级的库,适用于大多数情况;minidom
基于 DOM 规范,提供了更多的对象模型特性;而 lxml
是一个功能强大的第三方库,提供了额外的功能如 XPath 支持和更好的性能。
无论你选择哪种方法,理解和掌握 XML 解析的基本操作,如读取、查询、修改和保存 XML 文档,都是非常重要的。这将帮助你在实际项目中更有效地处理 XML 数据。