Res 合并工具:高效合并 ResA 和 ResB 文件夹,优先使用 ResA 内容
这是一个 Res 合并工具,可以将 ResA 和 ResB 文件夹中的 'values' 文件夹合并,并对所有文件按元素标签 ('attr', 'color', 'dimen', 'string', 'style', 'declare-styleable', 'item') 进行排重,优先使用 ResA 中的内容,如果 ResA 中不存在该元素,则使用 ResB 中的元素。
实现思路
- 遍历 'values' 文件夹,将所有文件按照元素标签分别存储在对应的字典中。
- 遍历 ResA 文件夹中的每个文件,将其中的元素按照标签存储在对应的字典中,如果该标签在字典中已经存在,则不进行操作。
- 遍历 ResB 文件夹中的每个文件,将其中的元素按照标签存储在对应的字典中,如果该标签在字典中已经存在,则不进行操作。
- 将 ResA 和 ResB 中的所有元素按照字典顺序合并成一个新的文件,并保存到指定的目录下。
代码实现
import os
import xml.etree.ElementTree as ET
# 元素标签列表
TAGS = ['attr', 'color', 'dimen', 'string', 'style', 'declare-styleable', 'item']
def parse_values_file(filepath):
"""
解析 'values' 文件,将其中的元素按照标签存储在对应的字典中
"""
tree = ET.parse(filepath)
root = tree.getroot()
data = {}
for tag in TAGS:
data[tag] = {}
for elem in root:
if elem.tag in TAGS:
if elem.get('name') in data[elem.tag]:
# 如果该元素已经存在,则不进行操作
continue
data[elem.tag][elem.get('name')] = elem
return data
def merge_res(resa_dir, resb_dir, output_dir):
"""
合并 ResA 和 ResB 文件夹中的所有元素,并保存到指定的目录下
"""
# 解析 ResA 文件夹中的所有 'values' 文件
resa_data = {}
for root, dirs, files in os.walk(resa_dir):
for file in files:
if file.endswith('.xml'):
filepath = os.path.join(root, file)
data = parse_values_file(filepath)
for tag in TAGS:
if tag in data:
if tag not in resa_data:
resa_data[tag] = {}
resa_data[tag].update(data[tag])
# 解析 ResB 文件夹中的所有 'values' 文件
resb_data = {}
for root, dirs, files in os.walk(resb_dir):
for file in files:
if file.endswith('.xml'):
filepath = os.path.join(root, file)
data = parse_values_file(filepath)
for tag in TAGS:
if tag in data:
if tag not in resb_data:
resb_data[tag] = {}
resb_data[tag].update(data[tag])
# 合并 ResA 和 ResB 中的所有元素
result_data = {}
for tag in TAGS:
result_data[tag] = {}
if tag in resa_data:
result_data[tag].update(resa_data[tag])
if tag in resb_data:
for key, value in resb_data[tag].items():
if key not in result_data[tag]:
result_data[tag][key] = value
# 保存合并后的结果
if not os.path.exists(output_dir):
os.makedirs(output_dir)
for tag in TAGS:
if tag in result_data:
root = ET.Element('resources')
for key, value in result_data[tag].items():
root.append(value)
tree = ET.ElementTree(root)
filepath = os.path.join(output_dir, f'{tag}.xml')
tree.write(filepath, encoding='utf-8', xml_declaration=True)
# 使用示例
merge_res('ResA', 'ResB', 'output')
原文地址: https://www.cveoy.top/t/topic/n0fx 著作权归作者所有。请勿转载和采集!