写一个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/eUKc 著作权归作者所有。请勿转载和采集!