元素,如果ResA中不存在该元素,则使用ResB中的元素。

实现思路:

  1. 遍历values文件夹,将所有文件按照元素标签分别存储在对应的字典中。

  2. 遍历ResA文件夹中的每个文件,将其中的元素按照标签存储在对应的字典中,如果该标签在字典中已经存在,则不进行操作。

  3. 遍历ResB文件夹中的每个文件,将其中的元素按照标签存储在对应的字典中,如果该标签在字典中已经存在,则不进行操作。

  4. 将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')
``
写一个Res 合并工具 将ResA 和ResB 进行合并 并对values文件夹里面的所有文件按attr 、color 、dimen 、string、style、declare-styleable、item 等元素标签进行排重优先使用ResA文件夹中的

原文地址: https://www.cveoy.top/t/topic/eUKc 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录