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

Python合并XML文件问题:代码仅追加未实现去重合并

问题

需要合并两个XML文件a.xml和b.xml,对相同package下的permission节点去重,生成目标文件c.xml。

输入文件内容

a.xml

<?xml version="1.0" encoding="utf-8"?>
<permissions>
  <privapp-permissions package="a">
        <permission name="x"/>
        <permission name="y"/>
  </privapp-permissions>
</permissions>

b.xml

<?xml version="1.0" encoding="utf-8"?>
<permissions>
  <privapp-permissions package="a">
        <permission name="x"/>
        <permission name="z"/>
  </privapp-permissions>
</permissions>

期望输出c.xml

<?xml version="1.0" encoding="utf-8"?>
<permissions>
  <privapp-permissions package="a">
        <permission name="x"/>
        <permission name="y"/>
        <permission name="z"/>
  </privapp-permissions>
</permissions>

原始代码(仅实现节点追加,未去重)

import xml.etree.ElementTree as ET

fname1 = "a.xml"
fname2 = "b.xml"
fname3 = "c.xml"

tree1 = ET.parse(fname1)
root1 = tree1.getroot()

tree2 = ET.parse(fname2)
root2 = tree2.getroot()

merged_tree = ET.ElementTree(ET.Element('root'))

merged_tree.getroot().append(root1)
merged_tree.getroot().append(root2)

merged_tree.write(fname3, encoding='utf-8')
解决方案

修改后的代码通过字典记录各包下已存在的权限,实现同包权限去重合并:

import xml.etree.ElementTree as ET

fname1 = "a.xml"
fname2 = "b.xml"
fname3 = "c.xml"

# 解析两个XML文件
tree1 = ET.parse(fname1)
root1 = tree1.getroot()
tree2 = ET.parse(fname2)
root2 = tree2.getroot()

# 用字典存储每个package对应的权限集合,实现去重
package_perms = {}

# 先读取第一个文件的权限信息
for privapp in root1.findall('privapp-permissions'):
    pkg = privapp.get('package')
    if pkg not in package_perms:
        package_perms[pkg] = set()
    for perm in privapp.findall('permission'):
        package_perms[pkg].add(perm.get('name'))

# 创建合并后的根节点
merged_root = ET.Element('permissions')

# 复制第一个文件的所有节点到合并根节点
for privapp in root1.findall('privapp-permissions'):
    merged_root.append(privapp)

# 处理第二个文件的节点,去重后添加
for privapp in root2.findall('privapp-permissions'):
    pkg = privapp.get('package')
    # 查找合并根节点中对应package的节点,不存在则新建
    target_node = None
    for node in merged_root.findall('privapp-permissions'):
        if node.get('package') == pkg:
            target_node = node
            break
    if not target_node:
        target_node = ET.SubElement(merged_root, 'privapp-permissions', package=pkg)
        package_perms[pkg] = set()
    
    # 添加未存在的权限
    for perm in privapp.findall('permission'):
        perm_name = perm.get('name')
        if perm_name not in package_perms[pkg]:
            target_node.append(perm)
            package_perms[pkg].add(perm_name)

# 生成最终XML文件,保留声明和正确的空元素格式
merged_tree = ET.ElementTree(merged_root)
merged_tree.write(fname3, encoding='utf-8', xml_declaration=True, short_empty_elements=True)

核心逻辑说明

  • 用package_perms字典记录每个包下已有的权限名称,利用集合的唯一性自动去重
  • 先完整保留第一个文件的节点结构
  • 遍历第二个文件时,针对每个包:
    • 若合并根节点已有该包节点,仅添加未存在的权限
    • 若没有该包节点,新建节点后添加所有权限
  • 写入文件时指定参数,确保生成符合要求的XML格式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 17:55:12