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

如何用Python合并同结构XML文件并去除重复元素

合并XML文件并按部件ID去重的最简方案

方法一:用lxml直接处理(推荐,代码简洁直观)

直接用Python的lxml库操作XML节点,逻辑清晰,代码量少,不需要转成字典或DataFrame绕弯。

代码示例

from lxml import etree
import os

# 替换成你的XML文件路径集合
xml_files = ["file1.xml", "file2.xml", "file3.xml"]
processed_parts = set()  # 存已处理过的部件ID,用于去重

# 初始化合并后的根节点,保留第一个文件的Header和根属性
tree = etree.parse(xml_files[0])
root = tree.getroot()
# 先清空第一个文件里的App节点,后续统一添加去重后的内容
for app in root.findall("App"):
    root.remove(app)

# 遍历所有XML文件
for file_path in xml_files:
    current_tree = etree.parse(file_path)
    current_root = current_tree.getroot()
    # 提取当前文件的所有App节点
    for app in current_root.findall("App"):
        # 获取<Part>标签里的部件ID
        part_id = app.find("Part").text.strip()
        if part_id not in processed_parts:
            processed_parts.add(part_id)
            # 将当前App节点复制到合并后的根节点中
            root.append(etree.fromstring(etree.tostring(app)))

# 写入最终的XML文件
with open("merged_unique.xml", "wb") as f:
    f.write(etree.tostring(root, pretty_print=True, encoding="utf-8", xml_declaration=True))

说明

  • 默认所有文件的Header内容一致,直接保留第一个文件的Header;如果Header存在差异,可根据需求修改逻辑(比如合并字段或保留最新版本)
  • 用set判断部件ID是否重复,查询效率高
  • pretty_print=True保证输出的XML格式整洁易读

方法二:调整Pandas参数正确读取XML

如果偏好使用Pandas,之前的问题是read_xml参数配置不当,只需指定XPath并读取节点属性,就能完整保留数据。

代码示例

import pandas as pd
import os

xml_files = ["file1.xml", "file2.xml", "file3.xml"]
df_list = []

for file_path in xml_files:
    # 指定XPath读取App节点,attrs=True读取App标签的属性(action、id)
    df = pd.read_xml(file_path, xpath=".//App", attrs=True)
    # 提取<Part>的文本作为去重依据,清理空格
    df["Part"] = df["Part"].apply(lambda x: x.strip() if x else None)
    df_list.append(df)

# 合并所有DataFrame,按Part字段去重(保留第一个出现的记录)
merged_df = pd.concat(df_list).drop_duplicates(subset="Part", keep="first").reset_index(drop=True)

# 提取第一个文件的Header内容,构造XML结构
header_df = pd.read_xml(xml_files[0], xpath=".//Header", attrs=True)
header_xml = header_df.to_xml(root_name="Header", index=False)

# 将去重后的App数据转为XML
app_xml = merged_df.to_xml(root_name="App", index=False, elem_wrap=True)

# 拼接成完整的ACES XML文档
final_xml = f"""<?xml version="1.0" encoding="utf-8"?>
<ACES version="4.2">
{header_xml}
{app_xml}
</ACES>"""

# 写入文件
with open("merged_unique_pandas.xml", "w", encoding="utf-8") as f:
    f.write(final_xml)

说明

  • xpath=".//App"指定只读取App节点,attrs=True会把App标签的属性转为DataFrame列
  • elem_wrap=True确保每条App数据被包裹在<App>标签内
  • Header字段会被自动解析并还原为XML结构

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 09:55:03