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

多XML文件子字段解析与匹配列合并的实现方法

批量处理XML生成目标DataFrame解决方案

核心思路

先统一收集所有可能的sifra值(保证所有行的列一致),再遍历每个XML提取数据,缺失的sifra自动填充0,最终合并为DataFrame。

完整代码实现

依赖准备

确保已安装pandas:

pip install pandas

代码片段

import xml.etree.ElementTree as ET
import pandas as pd
import os

# 解析单个XML文件,返回{sifra: vrednost, 文件名: ...}的字典
def parse_single_xml(xml_path):
    tree = ET.parse(xml_path)
    root = tree.getroot()
    data = {}
    # 遍历所有<energent>节点提取数据
    for energent in root.findall('.//energent'):
        sifra = energent.find('sifra').text.strip()
        vrednost = energent.find('vrednost').text.strip()
        # 转换数值类型,空值默认0
        data[sifra] = float(vrednost) if vrednost else 0.0
    # 记录当前XML文件名,方便溯源
    data['xml_filename'] = os.path.basename(xml_path)
    return data

# 批量处理指定目录下所有XML
def batch_process_xml(xml_dir):
    # 获取目录下所有XML文件(如需递归子目录,改用os.walk)
    xml_files = [os.path.join(xml_dir, f) for f in os.listdir(xml_dir) if f.lower().endswith('.xml')]
    
    all_data = []
    all_sifras = set()
    
    # 第一步:遍历所有文件,收集数据和所有sifra
    for xml_file in xml_files:
        file_data = parse_single_xml(xml_file)
        all_data.append(file_data)
        # 收集当前文件的sifra(排除文件名字段)
        current_sifras = [k for k in file_data.keys() if k != 'xml_filename']
        all_sifras.update(current_sifras)
    
    # 整理列顺序:文件名 + 排序后的sifra
    sorted_sifras = sorted(all_sifras)
    columns = ['xml_filename'] + sorted_sifras
    
    # 第二步:对齐每一行数据,缺失sifra填0
    aligned_rows = []
    for row_data in all_data:
        aligned_row = {col: row_data.get(col, 0.0) for col in columns}
        aligned_rows.append(aligned_row)
    
    # 生成DataFrame
    return pd.DataFrame(aligned_rows)

# ----------------------调用示例----------------------
# 替换为你的XML文件所在目录
xml_dir = './your_xml_folder'
result_df = batch_process_xml(xml_dir)

# 输出到指定格式(CSV/Excel)
result_df.to_csv('energent_output.csv', index=False)
result_df.to_excel('energent_output.xlsx', index=False)

关键优化点

  • 动态列适配:自动收集所有出现过的sifra,无需预先定义固定列,适配未知的sifra场景。
  • 数值处理:自动将vrednost转为数值类型,空值直接填充0,避免后续计算报错。
  • 可扩展性:如果XML分布在子目录,将os.listdir替换为os.walk即可递归遍历。

示例输出(对应需求格式)

假设两个XML文件分别包含不同的sifra,生成的DataFrame结构如下:

xml_filename101102103
data_001.xml25.50.018.0
data_002.xml0.030.015.0

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 14:56:28