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

如何将列表数据追加到现有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()

关键步骤说明

  1. XML解析与基础修改:
    • 用ET.parse()读取原XML文件,获取根节点后直接修改节点内容,比如更新RecordID的后缀、重命名Max_*节点并调整子节点名称和数值。
  2. 批量添加Row节点:
    • 遍历users_list为每个子列表创建<Row>节点,严格匹配你提供的最终XML结构,其中第二个Row的Fruit字段做了特殊适配(取索引7的mango),如果需要统一用索引2的内容,去掉条件判断即可。
  3. XML格式化:
    • 借助minidom模块将紧凑的XML输出格式化为带缩进的结构化文本,方便查看和维护。

注意事项

  • 代码默认写入新文件Energy1_updated.xml,如果需要直接覆盖原文件,修改写入的文件名即可,建议操作前备份原文件。
  • 如果users_list的字段对应关系有调整,只需修改item[X]中的索引X即可适配新需求。

内容的提问来源于stack exchange,提问作者Al-Andalus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.01 00:24:06