如何将列表数据追加到现有XML文件?(含具体场景与实现需求)
我来帮你解决这个XML修改的问题,你的核心需求是解析现有XML文件,修改部分节点内容,并为users_list中的每个子列表添加对应的<Row>节点。直接用文件追加的方式是错误的,因为XML是结构化文档,必须解析后修改再重新写入。下面是完整的实现方案:
完整实现代码
import xml.etree.ElementTree as ET from xml.dom import minidom def format_xml(element): """格式化XML输出,让结构更美观易读""" rough_string = ET.tostring(element, 'utf-8') reparsed = minidom.parseString(rough_string) return reparsed.toprettyxml(indent=" ") def update_xml(): # 1. 解析现有XML文件,获取根节点 tree = ET.parse('Energy1.xml') root = tree.getroot() # 2. 修改原XML中的节点内容,匹配目标结构 # 更新RecordID为「原ID-时间」格式 record_id_elem = root.find('RecordID') time_elem = root.find('Time') record_id_elem.text = f"{record_id_elem.text}-{time_elem.text}" # 重命名并修改Max_30节点为Max_30e_perc_25Hz max_30 = root.find('Max_30') max_30.tag = 'Max_30e_perc_25Hz' # 更新子节点名称和数值 i_30_1s = max_30.find('I_30Hz_1s') i_30_1s.tag = 'I_25Hz_1s' i_30_1s.text = '56.4059624876772' i_30_2s = max_30.find('I_30Hz_2s') i_30_2s.tag = 'I_25Hz_2s' i_30_2s.text = '7.44349841777878' # 重命名并修改Max_50节点为Max_30e_perc_75Hz max_50 = root.find('Max_50') max_50.tag = 'Max_30e_perc_75Hz' i_50_1s = max_50.find('I_50Hz_1s') i_50_1s.tag = 'I_75Hz_1s' i_50_1s.text = '1.56101496700227' i_50_2s = max_50.find('I_50Hz_2s') i_50_2s.tag = 'I_75Hz_2s' i_50_2s.text = '0.363494028934492' # 3. 遍历users_list,批量添加Row节点 users_list = [ ['C8_200', '5624', 'orange', '07-09-2020 8:48:02', 'banana', '3', '2316', 'mango', 'blue', 'yellow', 'red', '07-09-2020 09:08:43', '07-09-2020'], ['C8_200', '5624', 'orange', '07-09-2020 8:48:02', 'banana', '4', '2708', 'mango', 'blue', 'yellow', 'red', '07-09-2020 09:08:43', '07-09-2020'], ['C8_200', '414018', 'unkown', 'unkown', 'unkown', 'unkown', 'unkown', 'unkown', 'unkown', 'unkown', 'unkown', 'unkown', 'unkown'] ] for idx, item in enumerate(users_list): row = ET.SubElement(root, 'Row') # 按最终XML结构匹配子列表索引 ET.SubElement(row, 'RecordID').text = item[1] # 适配你提供的最终XML:第二个Row的Fruit取索引7的mango,其余取索引2的内容 fruit_text = item[7] if idx == 1 else item[2] ET.SubElement(row, 'Fruit').text = fruit_text # Type对应索引4,Number对应索引5(匹配你描述的索引需求) ET.SubElement(row, 'Type').text = item[4] if item[4] != 'unkown' else 'unkown' ET.SubElement(row, 'Number').text = item[5] if item[5] != 'unkown' else 'unkown' # 4. 格式化并写入文件 formatted_xml = format_xml(root) # 写入新文件避免覆盖原文件,如需覆盖可修改为'Energy1.xml' with open('Energy1_updated.xml', 'w', encoding='utf-8') as f: f.write(formatted_xml) # 执行更新操作 update_xml()
关键步骤说明
- XML解析与基础修改:
- 用
ET.parse()读取原XML文件,获取根节点后直接修改节点内容,比如更新RecordID的后缀、重命名Max_*节点并调整子节点名称和数值。
- 用
- 批量添加Row节点:
- 遍历
users_list为每个子列表创建<Row>节点,严格匹配你提供的最终XML结构,其中第二个Row的Fruit字段做了特殊适配(取索引7的mango),如果需要统一用索引2的内容,去掉条件判断即可。
- 遍历
- XML格式化:
- 借助
minidom模块将紧凑的XML输出格式化为带缩进的结构化文本,方便查看和维护。
- 借助
注意事项
- 代码默认写入新文件
Energy1_updated.xml,如果需要直接覆盖原文件,修改写入的文件名即可,建议操作前备份原文件。 - 如果
users_list的字段对应关系有调整,只需修改item[X]中的索引X即可适配新需求。
内容的提问来源于stack exchange,提问作者Al-Andalus
相关产品推荐
相关产品推荐

