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

XML文件处理技术求助:遍历XML并与同列名CSV合并建库(限标准库)

问题描述

我在处理XML文件时遇到困难,希望能打印XML文件以实现遍历操作。我的目标是将该XML文件与列名相同的CSV文件合并,之后用合并后的文件创建数据库,且不得使用非标准库。

现有代码及输出

代码

import xml.etree.ElementTree as ET

xml_file = ET.parse("E:/Research work/My connect/Sam/CETM50 - 2022_3 - Assignment Data/user_data.xml")
# 获取根标签
root = xml_file.getroot()
# 打印第一个标签的属性
e = ET.tostring(xml_file.getroot(), encoding='unicode', method='xml')
print(e)

输出

<user firstName="Jayne" lastName="Wilson" age="69" sex="Female" retired="False" dependants="1" marital_status="divorced" salary="36872" pension="0" company="Wall, Reed and Whitehouse" commute_distance="10.47" address_postcode="TD95 7FL">
解决方案(全标准库实现)

1. 遍历并提取XML数据

从输出可知,XML结构为根节点下包含多个<user>节点,每个节点的属性对应一条用户数据。以下代码可完整遍历并提取所有数据:

import xml.etree.ElementTree as ET

# 解析XML文件
tree = ET.parse("user_data.xml")
root = tree.getroot()

# 提取所有用户数据为字典列表
xml_records = []
for user_node in root.findall('user'):
    xml_records.append(user_node.attrib)

2. 读取CSV文件

使用标准库csv读取CSV数据,同样转为字典列表格式:

import csv

csv_records = []
# 替换为你的CSV文件路径
with open("user_data.csv", "r", encoding="utf-8") as csv_file:
    reader = csv.DictReader(csv_file)
    for row in reader:
        csv_records.append(row)

3. 合并XML与CSV数据

假设通过firstName和lastName作为唯一匹配键(可根据实际需求调整),合并两份数据:

# 构建CSV数据的索引字典,提升匹配效率
csv_index = {(row["firstName"], row["lastName"]): row for row in csv_records}

merged_records = []
for xml_row in xml_records:
    match_key = (xml_row["firstName"], xml_row["lastName"])
    if match_key in csv_index:
        # 合并字典,XML字段优先覆盖CSV(可根据需求调换顺序)
        merged_row = {**csv_index[match_key], **xml_row}
        merged_records.append(merged_row)
    else:
        # 无匹配的XML数据直接保留
        merged_records.append(xml_row)

4. 创建SQLite数据库

使用标准库sqlite3创建数据库并插入合并后的数据:

import sqlite3

# 连接数据库(文件不存在则自动创建)
conn = sqlite3.connect("user_database.db")
cursor = conn.cursor()

# 自动生成建表语句
if merged_records:
    columns = ", ".join([f"{col} TEXT" for col in merged_records[0].keys()])
    create_table_sql = f"CREATE TABLE IF NOT EXISTS users ({columns})"
    cursor.execute(create_table_sql)

    # 批量插入数据
    for record in merged_records:
        placeholders = ", ".join(["?"] * len(record))
        insert_sql = f"INSERT INTO users ({', '.join(record.keys())}) VALUES ({placeholders})"
        cursor.execute(insert_sql, tuple(record.values()))

# 提交更改并关闭连接
conn.commit()
conn.close()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 18:25:28