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

如何使用Python将嵌套XML(含对应XSD)转换为DataFrame?

将嵌套XML转换为Python DataFrame的方法

方法1:手动递归解析(通用嵌套场景)

对于结构复杂的嵌套XML,手动递归遍历节点是最灵活的方式,能精准控制字段提取逻辑:

  1. 导入依赖库
import xml.etree.ElementTree as ET
import pandas as pd
  1. 编写递归解析函数,扁平化嵌套节点
def parse_xml_node(node, parent_path="", data_dict=None):
    if data_dict is None:
        data_dict = {}
    
    # 处理当前节点的属性
    for attr, value in node.attrib.items():
        key = f"{parent_path}.{attr}" if parent_path else attr
        data_dict[key] = value
    
    # 处理当前节点的文本(非空时)
    if node.text and node.text.strip():
        key = parent_path if parent_path else node.tag
        data_dict[key] = node.text.strip()
    
    # 递归处理子节点
    for child in node:
        child_path = f"{parent_path}.{child.tag}" if parent_path else child.tag
        parse_xml_node(child, child_path, data_dict)
    
    return data_dict

def parse_nested_xml(xml_file):
    tree = ET.parse(xml_file)
    root = tree.getroot()
    # 假设根节点下的子节点是每条数据记录,根据实际XML结构调整
    records = []
    for record_node in root:
        record_data = parse_xml_node(record_node)
        records.append(record_data)
    return pd.DataFrame(records)
  1. 调用函数生成DataFrame
df = parse_nested_xml("your_nested.xml")
print(df.head())

注意:需要根据你的XML实际结构,调整parse_nested_xml中遍历根节点子节点的逻辑,确保每条数据对应根节点下的一个子节点。

方法2:使用pandas.read_xml(轻量嵌套场景)

如果XML的嵌套结构比较规整,pandas自带的read_xml可以快速处理,通过指定xpath来定位数据节点:

import pandas as pd

# 假设数据节点在<root>/<records>/<record>路径下,根据实际结构修改xpath
df = pd.read_xml(
    "your_nested.xml",
    xpath=".//record"  # 替换为你的数据节点的XPath
)
print(df.head())

如果嵌套层级较深,可通过namespaces参数处理XML命名空间,或结合xpath精准筛选字段。

方法3:利用XSD文件结构化转换(更严谨的场景)

如果有对应的XSD文件,可以用xsdata库先将XML映射为Python对象,再转换为DataFrame,这种方式能保证数据类型匹配XSD定义:

  1. 安装xsdata
pip install xsdata
  1. 从XSD生成Python类
xsdata your_schema.xsd --package generated

这会在generated目录下生成对应XSD结构的Python类文件。

  1. 加载XML并转换为DataFrame
from generated.your_schema import Root  # 替换为生成的根类名
import pandas as pd
from xsdata.formats.dataclass.parsers import XmlParser

parser = XmlParser()
root = parser.from_path("your_nested.xml", Root)

# 将对象转换为字典列表(需根据生成的类结构调整遍历逻辑)
records = []
for record in root.records:  # 假设根类下有records属性存储数据列表
    record_dict = {
        "id": record.id,
        "name": record.name,
        "detail.value": record.detail.value  # 处理嵌套字段
    }
    records.append(record_dict)

df = pd.DataFrame(records)
print(df.head())

这种方式适合对数据类型要求严格的场景,能直接复用XSD的结构定义,避免手动解析的误差。


内容的提问来源于stack exchange,提问作者Harry

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 00:27:20