Python解析XML多层嵌套节点提取内容转为DataFrame的实现问题
Python提取嵌套XML所有节点值存入DataFrame方案
你之前使用的固定层级XPath写法只能匹配指定深度的节点,无法覆盖所有嵌套层级的内容,可通过递归遍历节点的方式实现任意深度的节点值提取。
完整实现代码
依赖导入
import xml.etree.ElementTree as ET import pandas as pd
递归拍平节点工具函数
def flatten_xml_node(node, parent_tag_prefix=""): """ 递归提取指定节点下所有叶节点的标签与文本值 parent_tag_prefix参数用来给标签加前缀,避免不同层级同标签名冲突 """ flatten_result = {} for child_node in node: # 构造当前节点的标签名,存在父前缀则拼接 current_tag = f"{parent_tag_prefix}{child_node.tag}" if parent_tag_prefix else child_node.tag # 判断当前节点是否还有子节点,有则继续递归 if list(child_node): flatten_result.update(flatten_xml_node(child_node, parent_tag_prefix=f"{current_tag}_")) # 无下级节点则为叶节点,存储文本值 else: flatten_result[current_tag] = child_node.text.strip() if child_node.text else None return flatten_result
主执行逻辑
# 解析XML文件 xml_tree = ET.parse('D:\\python_script\\temp2\\AvisRevisions_20200201_20200229.xml') root_node = xml_tree.getroot() record_list = [] # 遍历所有avis节点 for avis_node in root_node.findall(".//avis"): # 拍平单个avis节点下的所有层级内容 single_avis_data = flatten_xml_node(avis_node) record_list.append(single_avis_data) # 转换为DataFrame result_df = pd.DataFrame(record_list) # 可按需导出为csv或做后续处理 # result_df.to_csv("xml_extract_result.csv", encoding="utf-8-sig", index=False)
补充说明
- 如果你确定XML中不同层级没有重名的标签,可以去掉标签前缀逻辑,直接用
child_node.tag作为字典的键即可。 - 如果XML中存在多个
<fournisseur>节点,该方案会自动把每个供应商的字段和上层公共字段拼接为独立行存入DataFrame,符合多记录的存储要求。
内容的提问来源于stack exchange,提问作者Jibran Karim
相关产品推荐
相关产品推荐

