在数据处理场景中,把分散在多个XML文件里的数据汇总成一个文件是常见需求。Python自带xml.etree.ElementTree模块,可以解析和生成XML,利用它我们能用很短的代码完成合并工作。

基本思路
合并多个XML文件的核心步骤包括:找到目标文件夹下所有XML文件,逐个解析并将每个文件根节点下的子元素添加到新的根节点中,最后把新树写入结果文件。假设这些XML文件结构一致,根节点名称相同。
示例代码
下面示例将当前目录下data文件夹里的所有XML合并为merged.xml:
import os
import xml.etree.ElementTree as ET
# 源文件夹路径
folder = "data"
# 结果文件
output_file = "merged.xml"
# 创建合并后的根节点
merged_root = ET.Element("records")
# 遍历文件夹中的XML文件
for fname in os.listdir(folder):
if fname.endswith(".xml"):
path = os.path.join(folder, fname)
tree = ET.parse(path)
root = tree.getroot()
# 将每个文件根节点下的子元素加入合并根节点
for child in root:
merged_root.append(child)
# 生成新树并保存
new_tree = ET.ElementTree(merged_root)
new_tree.write(output_file, encoding="utf-8", xml_declaration=True)
print("合并完成,输出文件:" + output_file)
处理不同根节点名称
如果待合并文件根节点名称不一致,可以统一用自定义根节点包裹,如上例中的records。也可在循环中判断root.tag来分类处理。
使用字符串拼接的替代方式
当文件很小且不需要校验结构时,也可直接读取文本拼接,但不推荐用于复杂数据:
import glob
files = glob.glob("data/*.xml")
with open("merged_simple.xml", "w", encoding="utf-8") as out:
out.write("<?xml version='1.0' encoding='utf-8'?>n")
out.write("<records>n")
for f in files:
with open(f, "r", encoding="utf-8") as inp:
# 跳过原声明,仅取根内部内容
lines = inp.read().split(">", 1)[1].rsplit("<", 2)[0]
out.write(lines + "n")
out.write("</records>n")
注意事项
- 合并前应确认各文件编码一致,避免写入乱码
- 若XML带有命名空间,需用ET.register_namespace处理
- 大文件建议使用增量解析iterparse减少内存占用
通过上述方法,你可以快速用Python把多个XML文件合并为一个,提升后续处理效率。