Python XML扁平化核心是递归遍历+路径拼接生成键值对,常用xml.etree.ElementTree(轻量)或lxml(支持命名空间/CData),亦可用pandas.read_xml处理表格型XML。
Python把XML扁平化,核心是把嵌套的树状结构转成一维的键值对(如字典或列表),常用方法是递归遍历+路径拼接。关键在于如何定义“扁平化”——多数场景指生成形如 {"root.child.grandchild": "value"} 的结构,或带类型/属性信息的展平结果。
用xml.etree.ElementTree递归提取(轻量、标准库)
适合结构较规则、不需保留命名空间或复杂属性的XML。思路是深度优先遍历,用点号连接路径,遇到文本内容就存入字典:
- 跳过纯空白文本和注释节点
- 对同一层级多个同名子元素,可加序号后缀(如
"items.item.0.name")避免覆盖 - 若需保留属性,可拼在路径末尾(如
"div.@class")或单独存为"div.attr.class"
示例代码片段:
import xml.etree.ElementTree as ETdef flatten_xml(element, path="", result=None): if result is None: result = {}
当前路径(去掉开头的点)
current_path = f"{path}.{element.tag}" if path else element.tag # 存文本内容(非None且非空白) if element.text and element.text.strip(): result[current_path] = element.text.strip() # 处理属性 for k, v in element.attrib.items(): result[f"{current_path}.@{k}"] = v # 递归子元素 for child in element: flatten_xml(child, current_path, result) return resulttree = ET.fromstring("12")
print(flatten_xml(tree))输出:{'root.a': '1', 'root.b.c': '2', 'root.b.c.@attr': 'x'}
用lxml增强处理(支持命名空间、XPath、更健壮)
当XML含命名空间、CDATA、混合内容或需按条件筛选时,
lxml更可靠。它提供iter()、XPath 和getchildren()等灵活接口:立即学习“Python免费学习笔记(深入)”;