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

