ElementTree是python标准库中轻量级xml解析模块,将XML映射为树状Element对象,支持加载(fromstring解析字符串、parse加载文件需getroot)、查找(find/findall/get)、遍历(iter)和序列化,但XPath功能有限、无命名空间高级支持。

ElementTree 是 Python 标准库中用于解析和生成 XML 的轻量级模块,它把 XML 文档映射为树状结构,每个节点是一个 Element 对象,支持遍历、查找、修改和序列化。
怎么加载 XML 字符串或文件
用 ET.fromstring() 解析字符串,用 ET.parse() 加载文件。注意:后者返回的是 ElementTree 对象,需调用 .getroot() 才能得到根 Element;前者直接返回根元素。
-
ET.fromstring("→ 直接得 ")text Element -
ET.parse("data.xml").getroot()→ 先读文件,再取根节点 - 如果 XML 带 XML 声明(如
),fromstring()也能正常处理,无需手动剥离
如何查找子元素和属性值
用 .find()、.findall() 和 .get() 是最常用组合。XPath 支持有限(仅基础路径,不支持 // 或轴运算),别指望它能替代 lxml 的完整 XPath。
-
elem.find("child")返回第一个匹配的直接子元素,找不到返回None -
elem.findall("child")返回所有同名直接子元素的列表 -
elem.get("id")获取属性值,不存在时默认返回None,可传第二个参数设默认值,如elem.get("id", "unknown") - 文本内容通过
elem.text访问,尾部空白不会被自动 strip —— 这是常见坑,需要手动.strip()
为什么用 iter() 而不是嵌套 for 循环遍历所有节点
当 XML 层级深、结构不固定,或你需要提取所有特定标签(不管在哪一层)时,.iter(tag) 比手动递归或多重 findall() 更简洁可靠。
立即学习“Python免费学习笔记(深入)”;
-
root.iter("item")返回所有名为item的后代元素(包括子孙),按文档顺序迭代 - 不支持通配符如
*,但可以传None来迭代所有元素:root.iter() - 性能上比逐层
findall()稍好,因为底层是 C 实现的一次深度优先遍历 - 注意:它不返回文本节点或注释节点,只返回
Element实例
import xml.etree.ElementTree as ET xml_str = ''' Python Crash Course Eric Matthes Fluent Python Luciano Ramalho ''' root = ET.fromstring(xml_str) for book in root.findall("book"): bid = book.get("id") title = book.find("title").text.strip() if book.find("title") is not None else "" print(f"ID: {bid}, Title: {title}")
ElementTree 简单够用,但遇到命名空间、复杂 XPath、DTD 验证或大文件流式解析时,就得换 lxml 或 xml.sax。它的默认行为(比如对空白文本的保留、无命名空间前缀自动展开)容易在跨系统数据交换时引发隐性问题。