You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 19:06:06