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

