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

Python批量解析不同Schema XML并合并为DataFrame方法

通用批量解析实现方案

你只需要把单文件解析逻辑封装成可复用函数,就能一次性处理任意数量同标签结构、不同Schema的XML文件,完全不需要重复编写解析代码。

核心思路

  • 将单个XML文件的解析、列名提取、行数据读取、DataFrame生成逻辑封装为独立函数,适配任意列定义的同结构文件
  • 整理所有待解析文件的路径为列表,循环调用解析函数批量生成DataFrame
  • 利用pandas 自动对齐列的特性,直接合并所有DataFrame,不同文件独有的列会自动补全缺失值

实现代码

import pandas as pd
import xml.etree.ElementTree as et
from pathlib import Path

def parse_letada_xml(file_path: str | Path) -> pd.DataFrame:
    """解析单个LETADA-LOOK_TYP结构的XML文件,返回对应DataFrame"""
    rows = []
    tree = et.parse(file_path)
    root = tree.getroot()

    # 遍历所有LETADA-LOOK_TYP节点(兼容单文件多节点的情况)
    for typ_node in root.findall("LETADA-LOOK_TYP"):
        # 提取列名:先去除首尾空白,再按任意空白分割,兼容空格、制表符、多空格场景
        col_text = typ_node.find("COLUMNS").text.strip()
        columns = col_text.split()
        
        # 提取所有数据行
        for data_node in typ_node.findall("DATA"):
            row_text = data_node.text.strip()
            row = row_text.split()
            rows.append(row)
    
    # 如需标记数据来源,可打开下面这行注释
    # df = pd.DataFrame(rows, columns=columns).assign(source_file=Path(file_path).name)
    df = pd.DataFrame(rows, columns=columns)
    return df

if __name__ == "__main__":
    # 把所有待解析的XML文件路径填到这个列表里,支持任意数量
    file_list = [
        "file1.xml",
        "file2.xml",
        "file3.xml"
        # 后续新增文件直接往这里加路径就行,不用改解析逻辑
    ]

    # 批量解析所有文件
    df_list = [parse_letada_xml(file) for file in file_list]
    # 合并所有结果,重置索引
    final_df = pd.concat(df_list, ignore_index=True)

优化点说明

  • 列和行的文本分割使用不带参数的str.split(),会自动匹配任意数量的空白字符(空格、制表符),同时提前用strip()清理首尾多余空白,比固定按制表符分割兼容性更强,不会出现空列名、列错位的问题
  • 函数兼容单个XML文件内存在多个LETADA-LOOK_TYP节点的场景,同时修复了原代码两次遍历根节点的冗余逻辑
  • 打开注释的source_file列配置后,可以直接看到每一行数据来自哪个源文件,方便数据校验
  • 新增待解析文件时,只需要把文件路径加到file_list列表中即可,不需要修改任何解析逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 15:12:24