XML文档拆分问题:重复<project>标签及格式修正求助
解决XML拆分时的重复标签与格式问题
问题根源
你遇到的问题本质是两个操作失误:
- 拆分时重复创建了
<project>节点,把原文档中提取的<project>元素嵌套进了新创建的<project>里,导致双重标签; 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
相关产品推荐
相关产品推荐

