XML文件凭借结构清晰、可扩展性强的特点,在配置文件存储、跨平台数据交互等场景中应用广泛。Python内置的ElementTree模块是处理XML的高效工具,无需安装额外依赖即可完成各类XML操作。

ElementTree基础概念
ElementTree将XML文档转换为树形结构,每个XML标签对应一个Element节点,节点包含标签名、属性、文本内容和子节点等信息。核心类包括ElementTree和Element,前者代表整个XML文档树,后者代表单个节点。
读取并解析XML文件
使用parse()方法可以直接读取本地XML文件并返回ElementTree对象,通过getroot()方法获取根节点。
import xml.etree.ElementTree as ET
# 解析本地XML文件
tree = ET.parse('test.xml')
# 获取根节点
root = tree.getroot()
# 打印根节点标签名
print(root.tag)
如果是XML格式的字符串,可以使用fromstring()方法直接解析:
import xml.etree.ElementTree as ET xml_str = '<users><user id="1">张三</user><user id="2">李四</user></users>' root = ET.fromstring(xml_str) print(root.tag)
提取XML节点数据
ElementTree提供了多种方法遍历和提取节点信息:
tag:获取节点标签名attrib:获取节点属性字典text:获取节点文本内容find():查找第一个匹配的子节点findall():查找所有匹配的子节点iter():递归遍历所有匹配标签的节点
以下示例解析包含用户信息的XML并提取数据:
import xml.etree.ElementTree as ET
xml_data = '''<users>
<user id="1">
<name>张三</name>
<age>25</age>
</user>
<user id="2">
<name>李四</name>
<age>28</age>
</user>
</users>'''
root = ET.fromstring(xml_data)
# 遍历所有user节点
for user in root.findall('user'):
user_id = user.attrib['id']
name = user.find('name').text
age = user.find('age').text
print(f'用户ID:{user_id},姓名:{name},年龄:{age}')
修改XML节点内容
可以直接修改Element对象的属性、文本内容,也可以添加或删除子节点:
import xml.etree.ElementTree as ET
xml_data = '<user id="1"><name>张三</name><age>25</age></user>'
root = ET.fromstring(xml_data)
# 修改属性
root.attrib['id'] = '100'
# 修改子节点文本
root.find('age').text = '26'
# 新增子节点
email_node = ET.SubElement(root, 'email')
email_node.text = 'zhangsan@ipipp.com'
# 打印修改后的XML字符串
print(ET.tostring(root, encoding='unicode'))
生成并保存新的XML文件
创建新的ElementTree对象后,使用write()方法可以将XML内容保存到文件:
import xml.etree.ElementTree as ET
# 创建根节点
root = ET.Element('users')
# 创建子节点
user1 = ET.SubElement(root, 'user')
user1.attrib = {'id': '1'}
name1 = ET.SubElement(user1, 'name')
name1.text = '张三'
age1 = ET.SubElement(user1, 'age')
age1.text = '25'
# 创建ElementTree对象
tree = ET.ElementTree(root)
# 保存到文件,设置编码和xml声明
tree.write('new_users.xml', encoding='utf-8', xml_declaration=True)
注意事项
- 解析不可信的XML文件时,建议关闭实体解析功能,避免XXE漏洞,可以通过
ET.parse('file.xml', parser=ET.XMLParser(resolve_entities=False))实现 - 如果XML包含命名空间,查找节点时需要带上完整的命名空间前缀
- 修改XML后保存时,注意设置正确的编码格式,避免中文乱码问题
PythonXMLElementTree解析修改时间:2026-07-08 15:03:28