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

如何在Python中不依赖Etree/Xmltodict库将XML转为CSV?

如何在Python中不使用第三方库将XML转换为CSV?

问题说明

给定如下XML内容:

<employees>
    <employee>
        <id>303</id>
        <name>varma</name>
        <age>20</age>
        <salary>120000</salary>
        <division>3</division>
    </employee>
    <employee>
        <id>304</id>
        <name>Cyril</name>
        <age>20</age>
        <salary>900000</salary>
        <division>3</division>
    </employee>
    <employee>
        <id>305</id>
        <name>Yojith</name>
        <age>20</age>
        <salary>900000</salary>
        <division>3</division>
    </employee>
</employees>

要求不使用Etree、Xmltodict等第三方库,将其转换为CSV格式。已有思路:1. 将XML转换为字典;2. 将字典转换为CSV。


实现方案

1. XML转字典

利用Python内置的正则表达式模块re处理XML字符串,提取目标数据:

  • 先清理XML中的换行和冗余空格,简化匹配逻辑
  • 批量匹配所有<employee>节点的内容
  • 对每个节点内容,提取子标签的键值对,组装成字典

2. 字典转CSV

使用Python标准库csv模块,将字典列表直接写入CSV文件,自动处理表头和行内容。


完整代码

import re
import csv

def xml_to_dict(xml_content):
    # 清理XML中的换行和多余空格
    cleaned_xml = re.sub(r'\s+', ' ', xml_content).strip()
    # 匹配所有employee节点的内部内容
    employee_pattern = re.compile(r'<employee>(.*?)</employee>')
    employee_matches = employee_pattern.findall(cleaned_xml)
    
    employee_list = []
    # 匹配每个employee内的标签与对应值
    tag_pattern = re.compile(r'<(\w+)>(.*?)</\1>')
    for emp_content in employee_matches:
        emp_dict = {}
        tag_pairs = tag_pattern.findall(emp_content)
        for tag_name, tag_value in tag_pairs:
            emp_dict[tag_name] = tag_value.strip()
        employee_list.append(emp_dict)
    return employee_list

def dict_to_csv(data_list, output_path='employees.csv'):
    if not data_list:
        print("无数据可转换")
        return
    # 以第一个字典的键作为CSV表头
    headers = data_list[0].keys()
    with open(output_path, 'w', newline='', encoding='utf-8') as csv_file:
        writer = csv.DictWriter(csv_file, fieldnames=headers)
        writer.writeheader()
        writer.writerows(data_list)
    print(f"CSV文件已生成:{output_path}")

# 示例XML数据
xml_raw = """<employees>
    <employee>
        <id>303</id>
        <name>varma</name>
        <age>20</age>
        <salary>120000</salary>
        <division>3</division>
    </employee>
    <employee>
        <id>304</id>
        <name>Cyril</name>
        <age>20</age>
        <salary>900000</salary>
        <division>3</division>
    </employee>
    <employee>
        <id>305</id>
        <name>Yojith</name>
        <age>20</age>
        <salary>900000</salary>
        <division>3</division>
    </employee>
</employees>"""

# 执行转换流程
employee_dicts = xml_to_dict(xml_raw)
dict_to_csv(employee_dicts)

输出结果

生成的employees.csv内容如下:

id,name,age,salary,division
303,varma,20,120000,3
304,Cyril,20,900000,3
305,Yojith,20,900000,3

内容的提问来源于stack exchange,提问作者JANAKI RAM KILUMU HU21CSEN0300

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 05:58:35