ElementTree是什么 如何用它在Python中解析XML

13次阅读

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

ElementTree是什么 如何用它在Python中解析XML

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 验证或大文件流式解析时,就得换 lxmlxml.sax。它的默认行为(比如对空白文本的保留、无命名空间前缀自动展开)容易在跨系统数据交换时引发隐性问题。

text=ZqhQzanResources