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

如何使用XSL将XML转换为CSV,可适配动态列属性

实现方案

你可以通过以下通用逻辑实现动态列的XML到CSV转换,无需硬编码列名,适配不同结构的同格式XML文件:

核心思路

  • 先遍历整份XML收集所有唯一列名,自动生成CSV表头
  • 逐行处理每个<insert>节点,根据列名匹配对应字段值,完成类型转换后输出
  • 自动处理缺列场景,缺失字段默认填空值

Python 实现示例

依赖Python内置的xml和csv模块,无需安装第三方库:

import xml.etree.ElementTree as ET
import csv

# 1. 解析XML
tree = ET.parse('你的XML文件路径.xml')
root = tree.getroot()

# 2. 动态收集所有唯一列名,默认按第一个insert节点的列顺序排序,后续新增列自动追加
columns = []
first_insert = root.find('insert')
if first_insert is not None:
    for col in first_insert.findall('column'):
        columns.append(col.attrib['name'])
for insert in root.findall('insert')[1:]:
    for col in insert.findall('column'):
        if col.attrib['name'] not in columns:
            columns.append(col.attrib['name'])

# 3. 写入CSV
with open('输出文件.csv', 'w', newline='', encoding='utf-8') as f:
    writer = csv.writer(f)
    # 写表头
    writer.writerow(columns)
    # 写每行数据
    for insert in root.findall('insert'):
        row = {}
        for col in insert.findall('column'):
            col_name = col.attrib['name']
            # 优先匹配对应类型的属性取值
            if 'value' in col.attrib:
                val = col.attrib['value']
            elif 'valueNumeric' in col.attrib:
                val = col.attrib['valueNumeric']
            elif 'valueBoolean' in col.attrib:
                val = col.attrib['valueBoolean'].upper()
            else:
                val = ''
            row[col_name] = val
        # 按表头顺序拼装行,缺列自动填空
        output_row = [row.get(col, '') for col in columns]
        writer.writerow(output_row)

适配说明

如果不需要固定列顺序,你可以把步骤2的列收集逻辑替换为用集合去重,代码更简洁:

columns = set()
for insert in root.findall('insert'):
    for col in insert.findall('column'):
        columns.add(col.attrib['name'])
columns = list(columns)

如果字段值包含逗号、引号等CSV特殊字符,内置的csv模块会自动完成转义,无需额外处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 12:57:02