深入解析 `xml.dom.minidom`:从入门到精通

Last updated on December 11, 2024 pm

深入解析 xml.dom.minidom:从入门到精通

在 Python 中,处理 XML 文件是一个常见的需求。Python 提供了多种库来解析和操作 XML,其中 xml.dom.minidom 是一个轻量级的 DOM(Document Object Model)解析器,适合处理小型 XML 文件。本文将通过实际例子,详细解释 xml.dom.minidom 的用法,具体到每个方法的功能和使用场景。


1. 什么是 xml.dom.minidom

xml.dom.minidom 是 Python 标准库中的一个模块,用于解析和操作 XML 文档。它实现了 W3C 的 DOM Level 2 规范,提供了一种将 XML 文档表示为树结构的方式。通过 xml.dom.minidom,你可以轻松地读取、修改和生成 XML 文件。


2. 安装与导入

xml.dom.minidom 是 Python 标准库的一部分,因此无需安装,直接导入即可使用:

1
import xml.dom.minidom

3. 核心方法详解

3.1 parse(file) - 解析 XML 文件

parse(file) 方法用于解析一个 XML 文件,并返回一个 Document 对象。

示例:

1
2
3
# 解析 XML 文件
dom = xml.dom.minidom.parse("example.xml")
print(dom.toxml()) # 输出整个 XML 文档

解释:

  • parse(file):传入一个文件路径或文件对象,返回一个 Document 对象。
  • toxml():将 Document 对象转换为字符串形式的 XML。

3.2 parseString(string) - 解析 XML 字符串

parseString(string) 方法用于解析一个 XML 字符串,并返回一个 Document 对象。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from xml.dom import minidom
# 解析 XML 字符串
xml_string = """<library>
<book id="1">
<title>Python Basics</title>
<author>John Doe</author>
</book>
<book id="2">
<title>Advanced Python</title>
<author>Jane Smith</author>
</book>
</library>
"""
dom = minidom.parseString(xml_string)
print(dom.toxml()) # 输出整个 XML 文档

解释:

  • parseString(string):传入一个 XML 字符串,返回一个 Document 对象。
  • toxml():将 Document 对象转换为字符串形式的 XML。

3.3 getElementsByTagName(tagname) - 获取指定标签的元素

getElementsByTagName(tagname) 方法用于获取所有指定标签名的元素,返回一个包含 Element 对象的列表。

示例:

1
2
3
4
# 获取所有 <book> 元素
books = dom.getElementsByTagName("book")
for book in books:
print(book.toxml()) # 输出每个 <book> 元素的 XML

解释:

  • getElementsByTagName(tagname):传入标签名,返回一个包含所有匹配元素的列表。
  • toxml():将元素转换为字符串形式的 XML。

3.4 getAttribute(name) - 获取元素的属性值

getAttribute(name) 方法用于获取元素的指定属性值。

示例:

1
2
3
# 获取 <book> 元素的 "id" 属性
book = dom.getElementsByTagName("book")[0]
print(book.getAttribute("id")) # 输出 "1"

解释:

  • getAttribute(name):传入属性名,返回属性值。

3.5 setAttribute(name, value) - 设置元素的属性值

setAttribute(name, value) 方法用于设置元素的属性值。

示例:

1
2
3
4
# 设置 <book> 元素的 "id" 属性
book = dom.getElementsByTagName("book")[0]
book.setAttribute("id", "2")
print(book.getAttribute("id")) # 输出 "2"

解释:

  • setAttribute(name, value):传入属性名和属性值,设置元素的属性。

3.6 createElement(tagName) - 创建新元素

createElement(tagName) 方法用于创建一个新的元素节点。

示例:

1
2
3
4
5
# 创建一个新的 <book> 元素
new_book = dom.createElement("book")
new_book.setAttribute("id", "3")
dom.documentElement.appendChild(new_book)
print(dom.toxml()) # 输出更新后的 XML

解释:

  • createElement(tagName):传入标签名,创建一个新的元素节点。
  • appendChild(node):将新元素添加到文档中。

3.7 createTextNode(data) - 创建文本节点

createTextNode(data) 方法用于创建一个包含文本内容的节点。

示例:

1
2
3
4
5
6
# 创建一个文本节点并添加到 <book> 元素中
text_node = dom.createTextNode("Python Programming")
new_book = dom.createElement("book")
new_book.appendChild(text_node)
dom.documentElement.appendChild(new_book)
print(dom.toxml()) # 输出更新后的 XML

解释:

  • createTextNode(data):传入文本内容,创建一个文本节点。
  • appendChild(node):将文本节点添加到元素中。

3.8 removeChild(node) - 删除子节点

removeChild(node) 方法用于删除指定的子节点。

示例:

1
2
3
4
# 删除第一个 <book> 元素
book = dom.getElementsByTagName("book")[0]
dom.documentElement.removeChild(book)
print(dom.toxml()) # 输出更新后的 XML

解释:

  • removeChild(node):传入要删除的节点,从父节点中移除该节点。

3.9 toxml()toprettyxml() - 生成 XML 字符串

toxml()toprettyxml() 方法用于将 Document 对象转换为字符串形式的 XML。

示例:

1
2
3
# 生成 XML 字符串
print(dom.toxml()) # 紧凑格式
print(dom.toprettyxml()) # 带缩进和换行的格式

解释:

  • toxml():生成紧凑的 XML 字符串。
  • toprettyxml():生成带缩进和换行的格式化 XML 字符串。

4. 实际案例:图书管理系统

假设我们有一个 XML 文件 books.xml,内容如下:

1
2
3
4
5
6
7
8
9
10
<library>
<book id="1">
<title>Python Basics</title>
<author>John Doe</author>
</book>
<book id="2">
<title>Advanced Python</title>
<author>Jane Smith</author>
</book>
</library>

4.1 读取 XML 文件

1
2
3
4
5
6
7
8
9
10
11
import xml.dom.minidom

# 解析 XML 文件
dom = xml.dom.minidom.parse("books.xml")

# 获取所有 <book> 元素
books = dom.getElementsByTagName("book")
for book in books:
title = book.getElementsByTagName("title")[0].firstChild.data
author = book.getElementsByTagName("author")[0].firstChild.data
print(f"Title: {title}, Author: {author}")

输出:

1
2
Title: Python Basics, Author: John Doe
Title: Advanced Python, Author: Jane Smith

4.2 修改 XML 文件

1
2
3
4
5
6
7
8
# 修改第一个 <book> 的标题
book = dom.getElementsByTagName("book")[0]
title = book.getElementsByTagName("title")[0]
title.firstChild.data = "Python for Beginners"

# 保存修改后的 XML
with open("books_updated.xml", "w") as f:
f.write(dom.toprettyxml())

输出(books_updated.xml):

1
2
3
4
5
6
7
8
9
10
<library>
<book id="1">
<title>Python for Beginners</title>
<author>John Doe</author>
</book>
<book id="2">
<title>Advanced Python</title>
<author>Jane Smith</author>
</book>
</library>

5. 总结

xml.dom.minidom 是一个功能强大且易于使用的 XML 解析库。通过本文的详细讲解和实际案例,你应该已经掌握了如何使用 xml.dom.minidom 来解析、修改和生成 XML 文件。无论是读取 XML 数据,还是动态生成 XML 文档,xml.dom.minidom 都能满足你的需求。

希望本文对你理解和使用 xml.dom.minidom 有所帮助!如果你有任何问题或需要进一步的帮助,请随时留言。


深入解析 `xml.dom.minidom`:从入门到精通
https://chongzicbo.github.io/2024/12/11/开发/Python/Python-001:使用xml.dom.minidom解析xml文件/
Author
程博
Posted on
December 11, 2024
Licensed under