如何使用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
相关产品推荐
相关产品推荐

