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

XML文档拆分问题:重复<project>标签及格式修正求助

解决XML拆分时的重复标签与格式问题

问题根源

你遇到的问题本质是两个操作失误:

  1. 拆分时重复创建了<project>节点,把原文档中提取的<project>元素嵌套进了新创建的<project>里,导致双重标签;
  2. xml.etree.ElementTree默认写入XML时,不会自动在声明后添加换行,也不会自动格式化缩进。

正确实现代码(Python 3.9+)

直接将提取到的<project>元素作为新文档的根节点,同时手动控制XML声明和格式:

import xml.etree.ElementTree as ET

# 加载大型XML文档
tree = ET.parse('large.xml')
root = tree.getroot()

# 遍历每个<project>元素并拆分保存
for idx, project_elem in enumerate(root.findall('project'), 1):
    # 直接用提取的project元素作为新文档的根
    new_tree = ET.ElementTree(project_elem)
    
    # 手动处理格式:先写XML声明并换行,再写入格式化的内容
    with open(f'project_{idx}.xml', 'w', encoding='utf-8') as output_file:
        # 写入XML声明,强制换行
        output_file.write('<?xml version="1.0" encoding="UTF-8"?>\n')
        # 自动添加缩进(Python 3.9+新增方法)
        ET.indent(new_tree, space='    ')
        # 写入内容时关闭自动声明(已经手动写过了)
        new_tree.write(output_file, encoding='unicode', xml_declaration=False)

低版本Python兼容方案(<3.9)

如果你的Python版本低于3.9,没有ET.indent()方法,可以用xml.dom.minidom来美化格式:

import xml.etree.ElementTree as ET
import xml.dom.minidom

tree = ET.parse('large.xml')
root = tree.getroot()

for idx, project_elem in enumerate(root.findall('project'), 1):
    # 将Element对象转为字符串
    raw_xml = ET.tostring(project_elem, encoding='utf-8')
    # 解析并美化格式
    dom_tree = xml.dom.minidom.parseString(raw_xml)
    pretty_xml = dom_tree.toprettyxml(indent='    ', encoding='utf-8').decode('utf-8')
    
    # 写入文件
    with open(f'project_{idx}.xml', 'w', encoding='utf-8') as output_file:
        output_file.write(pretty_xml)

效果验证

处理后的输出XML会符合你的要求:

<project>
    <!-- 项目内的子元素内容 -->
</project>
  • XML声明后自动换行
  • 仅保留一个<project>标签作为根节点
  • 元素自动缩进,格式规范

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 19:16:04