请求编写脚本:将CSV数据批量添加至指定格式XML文件
Python 脚本实现CSV数据批量导入XML的节点
针对你需要将CSV每行数据转为带属性的<entry>节点并插入已有XML的<login>节点的需求,以下是直接可用的Python脚本方案:
完整脚本
import csv import xml.etree.ElementTree as ET from xml.dom import minidom # 配置文件路径 csv_file_path = "data.csv" xml_file_path = "existing.xml" output_xml_path = "updated.xml" # 读取并验证CSV数据 csv_data = [] with open(csv_file_path, mode='r', encoding='utf-8') as csv_file: csv_reader = csv.DictReader(csv_file) for row_num, row in enumerate(csv_reader, start=2): # 行号从2开始(表头是行1) required_fields = ['name', 'ip', 'timeout'] if all(key in row and row[key].strip() for key in required_fields): csv_data.append({k: row[k].strip() for k in required_fields}) else: print(f"警告:跳过第{row_num}行 - 缺少必填字段或字段为空") # 解析目标XML文件 try: tree = ET.parse(xml_file_path) root = tree.getroot() except FileNotFoundError: print(f"错误:未找到XML文件 {xml_file_path}") exit(1) except ET.ParseError: print(f"错误:{xml_file_path} 不是有效的XML文件") exit(1) # 定位<login>节点 login_node = root.find('login') if login_node is None: print("错误:目标XML中未找到<login>节点") exit(1) # 批量创建并添加<entry>节点 for data in csv_data: entry = ET.SubElement(login_node, 'entry') entry.set('name', data['name']) entry.set('ip', data['ip']) entry.set('timeout', data['timeout']) # 格式化XML输出(保持可读性) def prettify_xml(elem): rough_string = ET.tostring(elem, 'utf-8') reparsed = minidom.parseString(rough_string) return reparsed.toprettyxml(indent=" ") # 写入结果文件 with open(output_xml_path, 'w', encoding='utf-8') as output_file: output_file.write(prettify_xml(root)) print(f"处理完成!更新后的XML已保存至 {output_xml_path}")
关键说明
CSV处理:
- 使用
csv.DictReader按表头读取数据,直接通过字段名获取对应值 - 自动验证每行是否包含
name、ip、timeout三个必填字段,跳过无效行并给出明确提示
- 使用
XML操作:
- 解析现有XML文件,自动定位
<login>节点,若节点不存在则终止运行并提示 - 为每行有效CSV数据创建带属性的
<entry>节点,直接追加到<login>节点下
- 解析现有XML文件,自动定位
输出优化:
- 生成格式化后的XML文件,避免压缩成一行,便于人工查看和后续编辑
- 不修改原XML文件,而是生成新的输出文件,保障原始数据安全
使用步骤
- 将你的CSV文件命名为
data.csv,确保表头为name,ip,timeout - 将待修改的XML文件命名为
existing.xml,放在同一目录下 - 运行脚本,生成的
updated.xml就是最终结果
注意事项
- 字段名大小写敏感,确保CSV表头与脚本中定义的
required_fields完全一致 - 若XML包含命名空间,需要修改
root.find('login')为带命名空间的查找(例如root.find('{http://example.com/ns}login')) - 大文件场景下,该脚本也能高效处理,无需担心性能问题
内容的提问来源于stack exchange,提问作者deep
相关产品推荐
相关产品推荐

