Python的xml.dom.minidom是标准库提供的轻量级DOM解析模块,能够把XML文档转换为树形节点结构,方便开发者对节点进行增删改查操作,不需要额外安装第三方依赖,适合处理中小型XML文件。

minidom基础使用流程
使用minidom解析XML通常分为三步:首先用parse或parseString方法加载XML数据得到文档对象,然后通过文档对象获取根节点或指定节点,最后遍历节点树提取或修改所需内容。
读取并解析XML文件
假设我们有如下内容的test.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<users>
<user id="1">
<name>张三</name>
<age>25</age>
<email>zhangsan@ipipp.com</email>
</user>
<user id="2">
<name>李四</name>
<age>28</age>
<email>lisi@ipipp.com</email>
</user>
</users>
使用minidom读取该文件的代码如下:
import xml.dom.minidom
# 解析本地XML文件,得到文档对象
doc = xml.dom.minidom.parse("test.xml")
# 获取根节点
root = doc.documentElement
print("根节点名称:", root.nodeName)
print("根节点标签名:", root.tagName)
遍历节点获取内容
DOM树中的节点分为元素节点、文本节点等类型,获取子节点时需要注意过滤掉空白文本节点,避免获取到无用的换行和空格内容。
import xml.dom.minidom
doc = xml.dom.minidom.parse("test.xml")
root = doc.documentElement
# 获取所有user子元素节点
user_nodes = root.getElementsByTagName("user")
for user in user_nodes:
# 获取user节点的id属性
user_id = user.getAttribute("id")
# 获取name子节点
name_node = user.getElementsByTagName("name")[0]
# 获取name节点的文本子节点,再获取文本内容
name = name_node.firstChild.data
# 获取age子节点的文本内容
age_node = user.getElementsByTagName("age")[0]
age = age_node.firstChild.data
# 获取email子节点的文本内容
email_node = user.getElementsByTagName("email")[0]
email = email_node.firstChild.data
print(f"用户ID:{user_id},姓名:{name},年龄:{age},邮箱:{email}")
修改XML节点内容
可以通过修改节点的firstChild.data属性来更新文本内容,修改完成后需要将文档重新写入文件。
import xml.dom.minidom
doc = xml.dom.minidom.parse("test.xml")
root = doc.documentElement
# 修改第一个user的age内容
first_user = root.getElementsByTagName("user")[0]
age_node = first_user.getElementsByTagName("age")[0]
age_node.firstChild.data = "26"
# 将修改后的文档写入新文件
with open("test_modified.xml", "w", encoding="utf-8") as f:
doc.writexml(f, indent="", addindent="t", newl="n", encoding="utf-8")
创建新节点并添加
minidom支持创建新的元素节点、文本节点,并添加到现有节点树中。
import xml.dom.minidom
doc = xml.dom.minidom.parse("test.xml")
root = doc.documentElement
# 创建新的user元素节点
new_user = doc.createElement("user")
# 设置id属性
new_user.setAttribute("id", "3")
# 创建name子节点
name_node = doc.createElement("name")
# 创建name的文本节点
name_text = doc.createTextNode("王五")
name_node.appendChild(name_text)
# 创建age子节点
age_node = doc.createElement("age")
age_text = doc.createTextNode("30")
age_node.appendChild(age_text)
# 创建email子节点
email_node = doc.createElement("email")
email_text = doc.createTextNode("wangwu@ipipp.com")
email_node.appendChild(email_text)
# 把所有子节点添加到new_user
new_user.appendChild(name_node)
new_user.appendChild(age_node)
new_user.appendChild(email_node)
# 把new_user添加到根节点
root.appendChild(new_user)
# 写入新文件
with open("test_with_new_user.xml", "w", encoding="utf-8") as f:
doc.writexml(f, indent="", addindent="t", newl="n", encoding="utf-8")
解析XML字符串
如果是XML格式的字符串,不需要先写入文件,可以直接用parseString方法解析。
import xml.dom.minidom
xml_str = """<?xml version="1.0" encoding="utf-8"?>
<book>
<title>Python编程入门</title>
<price>59.9</price>
</book>"""
# 解析XML字符串
doc = xml.dom.minidom.parseString(xml_str)
root = doc.documentElement
title = root.getElementsByTagName("title")[0].firstChild.data
price = root.getElementsByTagName("price")[0].firstChild.data
print(f"书名:{title},价格:{price}")
注意事项
- minidom会将XML中的换行和缩进识别为空白文本节点,遍历子节点时建议通过
nodeType判断,元素节点类型为doc.ELEMENT_NODE,可以过滤无用节点。 - 修改XML后写入文件时,
writexml方法的参数可以控制缩进格式,让输出的XML文件更易读。 - 对于超大XML文件,minidom会把整个文档加载到内存,可能会占用较多资源,此时更适合使用迭代式的解析方式如
xml.sax。
xml.dom.minidomPythonXML解析DOM操作修改时间:2026-06-11 01:21:21