合并多个XML文件的核心难点在于每个XML文档都有自己的根元素,直接拼接字符串会导致结果中出现多个根节点,从而不符合XML规范。正确的方式是用解析器把每个文件读成树结构,再把子节点挂到统一的根下。下面以Python标准库xml.etree.ElementTree为例,演示如何把同一目录下的多个XML文件合并成一个。

使用Python合并XML文件
假设我们有多个结构相似的XML文件,它们都有一个顶层根节点,我们希望把所有文件的子节点合并到新的根节点<combined>中。代码如下:
import xml.etree.ElementTree as ET
import glob
# 新建合并后的根节点
merged = ET.Element('combined')
# 遍历当前目录下所有data_开头的xml文件
for file_path in glob.glob('data_*.xml'):
tree = ET.parse(file_path)
root = tree.getroot()
# 将原根节点的子节点全部添加到合并根节点下
for child in root:
merged.append(child)
# 写出合并后的XML
new_tree = ET.ElementTree(merged)
new_tree.write('merged.xml', encoding='utf-8', xml_declaration=True)
处理不同根节点名称
如果原文件根节点名称不一致,但内部数据结构相同,可以忽略原根名称,只搬移其子节点,如上例所示。若需要保留来源信息,可以给每个原文件节点包一层<source>标签:
import xml.etree.ElementTree as ET
import glob
merged = ET.Element('combined')
for file_path in glob.glob('data_*.xml'):
root = ET.parse(file_path).getroot()
# 用source包裹原根,并记录文件名
wrap = ET.SubElement(merged, 'source', file=file_path)
wrap.append(root)
ET.ElementTree(merged).write('merged_with_source.xml', encoding='utf-8', xml_declaration=True)
使用命令行工具
如果不想写代码,也可以利用支持XML的工具,例如xmllint配合简单脚本完成拼接,但通用性不如编程方式。对于复杂结构,仍建议用代码控制合并逻辑。
合并时的注意事项
- 确保每个输入文件都是格式良好的XML,否则解析会报错。
- 合并后只能有一个根节点,不能出现多个顶层元素。
- 若不同文件定义了相同的命名空间,需统一处理避免冲突。
- 注意字符编码,写出时明确指定如utf-8。
小结
合并多个XML文件并不复杂,关键是借助解析器而非文本拼接。使用Python的ElementTree可以在几十行内完成稳定合并,也能灵活应对不同结构。掌握这种方法后,处理日志汇总、报文整合等场景都会更高效。