Python合并多个XML文件的核心是创建统一根节点,再将各文件根元素的直接子元素(非整个根)追加其下;需用list(root)避免迭代修改问题,注意命名空间、属性冲突处理及必要时深拷贝。

Python中合并多个XML文件为一个树,核心思路是:创建一个根节点,然后将每个XML文件的根子元素(或全部子元素)追加到该根下。注意不能直接拼接整个XML文档字符串,而应使用解析后的Element对象操作。
使用xml.etree.ElementTree合并多个XML
这是标准库方案,轻量且无需额外安装。关键点在于:只提取每个XML的根节点下的子元素(而非整个根节点),避免嵌套根节点。
- 用ET.parse()加载每个XML文件,获取其根元素
- 遍历每个根元素的root.iterchildren()(需lxml)或list(root)(标准库)获取直接子元素
- 对每个子元素调用new_root.append(child),注意需用copy.deepcopy()避免重复引用(若需保留原结构且文件间有同名ID等约束)
处理命名空间和属性冲突
若多个XML含相同命名空间前缀或全局属性(如xmlns),直接合并可能导致解析异常或前缀覆盖。建议:
- 统一预处理:读取时用ET.register_namespace()注册常用前缀,或解析后手动清理冗余xmlns声明
- 对重复属性(如id),在追加前重写值,例如加文件序号前缀:child.set('id', f'file2_{child.get("id", "")}')
用lxml提升健壮性(推荐复杂场景)
当XML含DOCTYPE、注释、CDATA或需要精确保序/命名空间时,lxml.etree更可靠:
网页中拖动 DIV 是很常见的操作,今天就分享给大家一个 jQuery 多列网格拖动布局插件,和其它的插件不太一样的地方在于你处理拖放的元素支持不同大小,并且支持多列的网格布局,它们会自动的根据位置自己排序和调整。非常适合你开发具有创意的应用。这个插件可以帮助你将任何的 HTML 元素转换为网格组件
立即学习“Python免费学习笔记(深入)”;
- 支持parser=etree.XMLParser(remove_blank_text=True)自动清理空白
- 可用root.iterchildren()精准获取子节点,避免误吞文本节点
- 合并后用etree.tostring(new_root, encoding='unicode', pretty_print=True)格式化输出
完整可运行示例(标准库版)
假设有a.xml和b.xml,内容均为
import xml.etree.ElementTree as ET
<h1>创建统一根</h1><p>merged = ET.Element("merged")</p><h1>合并多个文件</h1><p>for file in ["a.xml", "b.xml"]:
tree = ET.parse(file)
root = tree.getroot()</p><h1>将每个文件的直接子元素加入merged根</h1><pre class="brush:php;toolbar:false;">for child in list(root): # list()避免迭代时修改问题
merged.append(child)输出结果
ET.dump(merged) # 或 ET.ElementTree(merged).write("merged.xml", encoding="utf-8", xml_declaration=True)









