基于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])
使用说明
- 将脚本保存为
xml_processor.py - 在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
相关产品推荐
相关产品推荐

