如何用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
相关产品推荐
相关产品推荐

