Python递归遍历XML树需用xml.etree.ElementTree,核心是Element对象可直接迭代其子元素;推荐用for child in elem:递归处理,或用elem.iter()深度优先遍历所有后代(含自身)。

Python递归遍历XML树的所有节点,核心是使用xml.etree.ElementTree模块中的Element对象,它天然支持树形结构和递归访问。关键在于:每个元素的.children(实际是.iter()或.getchildren()已弃用)应通过.iter()或直接遍历.iterchildren()(不存在)——正确方式是用elem.iter()获取全部后代,或用for child in elem:遍历直接子元素。
递归访问所有直接子节点(深度优先)
这是最典型的递归写法:对当前元素做处理,再对其每个直接子元素递归调用。注意Element实例本身可被直接迭代,等价于遍历其直属子元素(不包括自身或后代)。
示例代码:
import xml.etree.ElementTree as ETdef traverse_recursive(elem, depth=0):
立即学习“Python免费学习笔记(深入)”;
打印当前节点信息(标签、文本、属性)
indent = " " * depth print(f"{indent}Tag: {elem.tag}, Text: '{elem.text.strip() if elem.text else ''}', Attr: {elem.attrib}") # 递归处理每个直接子元素 for child in elem: traverse_recursive(child, depth + 1)使用示例
xml_str = '''
text_b ''' root = ET.fromstring(xml_str) traverse_recursive(root)text_d
遍历所有节点(含自身)并区分节点类型
有时需明确区分元素节点、文本节点、尾部文本(.tail)等。ElementTree中只有Element对象,文本和尾部文本作为字符串附在元素上,不是独立节点。若要“访问所有逻辑节点”,需手动处理.text和.tail(它们出现在元素前后,属于该元素的上下文)。
建议做法:
- 先处理当前元素(如打印标签、属性)
- 若
elem.text非空且非纯空白,可视为其前的文本节点 - 递归处理每个子元素
- 若
elem.tail非空且非纯空白,可视为该元素结束后的文本节点(常用于格式化XML)
用.iter()替代手写递归(更简洁,非严格递归但效果一致)
如果目标只是访问所有元素(不强调递归过程本身),elem.iter()是最简单高效的方式,它返回一个生成器,按深度优先顺序遍历当前元素及其所有后代元素(包括自身)。
示例:
for elem in root.iter(): # 包括 root 自身
print(f"Tag: {elem.tag}, Text: '{elem.text.strip() if elem.text else ''}'")
若只想要后代(不含自身),用 root.iter("*") 或 list(root)[0].iter() 等,但通常 iter() 就够用
处理命名空间和特殊字符的注意事项
当XML含命名空间时,标签名会变成{namespace}tag格式,直接比较elem.tag == "tag"会失败。建议:










