在Python中处理XML文件的修改操作,最常用的标准库是xml.etree.ElementTree,它提供了简单易用的API来解析、修改和保存XML文件,无需额外安装第三方依赖,适合大多数常规XML处理场景。

XML文件修改的核心流程
修改XML文件并保存的整体流程可以分为四个步骤:首先解析目标XML文件得到元素树对象,然后遍历或定位到需要修改的目标节点,接着修改节点的属性或者文本内容,最后将修改后的元素树写入到新的文件或者覆盖原文件。
解析XML文件
使用ElementTree的parse方法可以直接解析本地XML文件,返回ElementTree对象,通过getroot方法可以获取XML的根节点,后续所有节点操作都基于根节点展开。
import xml.etree.ElementTree as ET
# 解析XML文件,替换为你的实际文件路径
tree = ET.parse("test.xml")
# 获取根节点
root = tree.getroot()
修改节点属性
XML节点的属性存储在节点的attrib字典中,我们可以直接通过字典的键值操作来修改、新增或者删除节点属性。如果要修改已有属性,直接给对应的键赋新值即可;如果要新增属性,添加新的键值对即可。
假设我们有如下结构的XML文件:
<users>
<user id="1" role="normal">
<name>张三</name>
<age>20</age>
</user>
<user id="2" role="admin">
<name>李四</name>
<age>25</age>
</user>
</users>
现在需要把id为1的用户的role属性从normal修改为vip,代码如下:
# 遍历所有user节点
for user in root.findall("user"):
# 获取节点的id属性
user_id = user.get("id")
# 匹配目标节点
if user_id == "1":
# 修改role属性
user.set("role", "vip")
# 也可以新增属性,比如添加last_login属性
user.set("last_login", "2024-05-01")
# 如果要删除属性,可以使用del user.attrib["属性名"]
break
修改节点值
节点的文本内容(也就是节点的值)存储在节点的text属性中,直接修改text属性的值就可以完成节点内容的修改。如果需要修改子节点的文本,先定位到子节点再修改其text属性即可。
基于上面的XML示例,我们把id为2的用户的name改为王五,age改为30,代码如下:
for user in root.findall("user"):
user_id = user.get("id")
if user_id == "2":
# 修改name子节点的文本
name_node = user.find("name")
name_node.text = "王五"
# 修改age子节点的文本
age_node = user.find("age")
age_node.text = "30"
break
保存修改后的XML文件
修改完成后,使用ElementTree对象的write方法就可以将修改后的内容保存到文件。需要注意设置encoding参数为UTF-8,同时指定xml_declaration为True,保证生成的XML文件有正确的声明头,避免中文乱码问题。
# 保存修改后的内容,可以覆盖原文件或者生成新文件
tree.write("modified_test.xml", encoding="UTF-8", xml_declaration=True)
完整示例代码
下面是整合了所有步骤的完整示例,直接运行就可以完成XML文件的修改和保存:
import xml.etree.ElementTree as ET
def modify_xml():
# 解析XML文件
tree = ET.parse("test.xml")
root = tree.getroot()
# 修改节点属性
for user in root.findall("user"):
user_id = user.get("id")
if user_id == "1":
user.set("role", "vip")
user.set("last_login", "2024-05-01")
# 修改节点值
for user in root.findall("user"):
user_id = user.get("id")
if user_id == "2":
name_node = user.find("name")
name_node.text = "王五"
age_node = user.find("age")
age_node.text = "30"
# 保存文件
tree.write("modified_test.xml", encoding="UTF-8", xml_declaration=True)
print("XML文件修改完成并保存")
if __name__ == "__main__":
modify_xml()
注意事项
- 如果XML文件中有命名空间,定位节点时需要在标签名前加上命名空间前缀,比如
root.find("{命名空间URL}user") - write方法默认不会自动格式化XML的缩进,如果需要美观的缩进格式,可以额外使用minidom模块对输出内容进行格式化处理
- 修改文件前建议先备份原文件,避免修改错误导致原数据丢失
PythonXML节点属性节点值ElementTree修改时间:2026-07-14 23:21:34