Python标准库中的ElementTree模块提供了轻量且高效的XML处理能力,修改XML节点属性是其核心功能之一,操作过程不需要依赖第三方库,适配大多数常规XML处理场景。

ElementTree修改XML节点属性的核心逻辑
ElementTree将XML文档解析为树形结构,每个节点对应一个Element对象,节点的属性存储在Element对象的attrib字典中,修改属性本质上就是操作这个字典的键值对。我们可以通过节点查找方法定位到目标节点,然后直接修改attrib中的对应属性值,最后将修改后的树写回文件即可。
修改XML节点属性的完整步骤
1. 导入ElementTree模块并解析XML文件
首先需要从xml.etree模块中导入ElementTree,然后使用parse()方法解析本地XML文件,得到ElementTree对象,再通过getroot()方法获取根节点。
import xml.etree.ElementTree as ET
# 解析XML文件,得到ElementTree对象
tree = ET.parse('test.xml')
# 获取XML根节点
root = tree.getroot()
2. 定位需要修改属性的目标节点
可以通过遍历节点、使用find()或findall()方法定位目标节点,find()返回第一个匹配的节点,findall()返回所有匹配的节点列表。如果需要按属性筛选节点,可以结合XPath语法实现。
# 查找根节点下第一个名为user的子节点
target_node = root.find('user')
# 查找所有名为item的子节点
target_nodes = root.findall('item')
# 查找class属性为student的user节点
student_node = root.find("user[@class='student']")
3. 修改目标节点的属性
Element对象的attrib是一个字典,我们可以直接修改字典中的键值对来更新属性,也可以使用set()方法设置属性,使用get()方法获取属性值。
# 方式1:直接修改attrib字典
target_node.attrib['age'] = '25'
# 方式2:使用set方法设置属性
target_node.set('name', '张三')
# 获取属性值验证修改结果
print(target_node.get('name'))
print(target_node.get('age'))
4. 保存修改后的XML文件
修改完成后,调用ElementTree对象的write()方法将修改后的内容写入文件,注意指定编码格式避免中文乱码问题。
# 将修改后的内容写入新文件,指定编码为utf-8
tree.write('modified_test.xml', encoding='utf-8', xml_declaration=True)
完整示例演示
假设我们有一个名为users.xml的原始文件,内容如下:
<?xml version='1.0' encoding='utf-8'?>
<users>
<user id="1" name="李四" age="20" class="student"/>
<user id="2" name="王五" age="22" class="teacher"/>
</users>
现在需要将所有class为student的user节点的age属性修改为21,完整实现代码如下:
import xml.etree.ElementTree as ET
# 解析XML文件
tree = ET.parse('users.xml')
root = tree.getroot()
# 遍历所有user节点,筛选class为student的节点修改age属性
for user in root.findall('user'):
if user.get('class') == 'student':
user.set('age', '21')
print(f"已修改用户{user.get('name')}的年龄为21")
# 保存修改后的文件
tree.write('modified_users.xml', encoding='utf-8', xml_declaration=True)
print("XML文件修改完成,已保存为modified_users.xml")
注意事项
- 修改属性时如果属性不存在,使用
set()方法会新增该属性,直接修改attrib字典新增键值对也可以实现新增属性。 - 如果XML文件包含命名空间,定位节点时需要在标签名前加上命名空间前缀,否则会匹配失败。
- 调用
write()方法时如果不指定xml_declaration=True,输出的XML文件可能没有声明头,部分场景会出现解析问题。 - 如果处理的XML文件较大,建议使用迭代解析的方式,避免一次性加载全部内容占用过多内存。
PythonElementTreeXMLXML节点属性修改时间:2026-06-27 00:12:18