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

基于Python3实现XML中<desc>标签后内容合并至该标签

处理大型XML文件的Python实现方案

核心思路

用lxml的流式解析(iterparse)处理大型XML,避免一次性加载整个文件占用过多内存。遍历每个<programme>标签,将<desc>之后的子标签内容按指定格式追加到<desc>内部,随后删除原子标签。

实现脚本

import sys
from lxml import etree

def process_programme(programme):
    # 定位当前programme下的desc元素
    desc = programme.find('desc')
    if desc is None:
        return
    
    # 收集desc之后的所有兄弟元素
    elements_to_merge = []
    next_sibling = desc.getnext()
    while next_sibling is not None:
        elements_to_merge.append(next_sibling)
        next_sibling = next_sibling.getnext()
    
    # 按指定格式拼接内容(可按需修改格式)
    additional_content = []
    for elem in elements_to_merge:
        text = elem.text.strip() if elem.text else ''
        if text:
            additional_content.append(f"*{elem.tag}:* {text}")
    
    # 追加内容到desc末尾
    if additional_content:
        if desc.text and not desc.text.endswith('\n'):
            desc.text += '\n\n'
        elif not desc.text:
            desc.text = ''
        desc.text += '\n'.join(additional_content)
    
    # 删除原有的子标签
    for elem in elements_to_merge:
        programme.remove(elem)

def main(input_path, output_path):
    # 流式解析,仅关注programme标签的结束事件
    context = etree.iterparse(input_path, events=('end',), tag='programme')
    
    root = None
    for event, elem in context:
        if root is None:
            root = elem.getroottree()
        process_programme(elem)
        # 清理已处理元素,释放内存
        elem.clear()
        while elem.getprevious() is not None:
            del elem.getparent()[0]
    
    # 写入处理后的XML
    if root is not None:
        with open(output_path, 'wb') as f:
            root.write(f, encoding='utf-8', pretty_print=True)

if __name__ == "__main__":
    if len(sys.argv) != 3:
        print("用法: python3 xml_processor.py <输入XML文件> <输出XML文件>")
        sys.exit(1)
    main(sys.argv[1], sys.argv[2])

使用说明

  1. 将脚本保存为xml_processor.py
  2. 在Linux终端执行:
python3 xml_processor.py input.xml output.xml

关键细节说明

  • 内存优化:流式解析+即时清理已处理元素,适合资源有限的Linux主机,不会因超大XML耗尽内存
  • 格式自定义:脚本中additional_content的拼接规则(*{elem.tag}:* {text})可按需修改,比如换成【{elem.tag}】{text}等格式
  • 空白处理:自动过滤子标签的空文本,避免追加无效内容
  • 编码兼容:默认以UTF-8编码读写,适配绝大多数XML文件

注意事项

  • 处理前务必备份原XML文件,防止数据丢失
  • 若XML包含命名空间,需在find和iterparse中添加对应命名空间参数(根据实际结构调整)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 20:55:18