Android strings.xml按照key修改

strings.xml匹配替换

将两个Android项目中的多语言字符串文件(strings.xml)进行比较,如果其中一个项目中包含另一个项目没有的字符,则合并到单一的输出文件,并以 key 在原始 XML 文件中更新 value 值。如果key匹配不准确则忽略它。

具体来说:

  1. 引入 re, xml.etree.ElementTree 和 argparse 模块。
  2. 定义命令行参数 parser。
  3. 解析输入、源和输出XML文件,并得到其 root 节点。
  4. 将所有 a.xml 中的 key-value 存储在字典 a_dict 中。
  5. 遍历 b.xml 的 string 标签,使用正则表达式判断每个键是否与a_dict相等且值不同,然后更新为a_dict中的值。
  6. 保存修改后的b_tree到指定的输出路径。
  7. 打印成功执行修改操作的消息。

该代码涉及解析XML文件、字典处理、正则表达式匹配、文件读写和命令行接口设计。

import re
from lxml import etree
import argparse
parser = argparse.ArgumentParser(description='Process android strings.xml files.')
parser.add_argument('-i', '--input', type=str, help='the source xml file as input')
parser.add_argument('-s', '--source', type=str, default='strings.xml', 
 help='the xml file will be modified') # 指定默认的文件名
parser.add_argument('-o', '--output', type=str, default='strings.xml', 
 help='path to the output xml file') # 指定默认的文件名
args = parser.parse_args()
print(args)
a_tree = etree.parse(args.input) 
a_root = a_tree.getroot() 
b_tree = etree.parse(args.source)
b_root = b_tree.getroot()
# 遍历 a.xml 中所有 string 标签,将其键值对存储到字典 a_dict 中
a_dict = {}
for string in a_root.iter('string'):
 key = string.attrib['name']
 value = string.text
 a_dict[key] = value
# 遍历 b.xml 中所有 string 标签,若和 a_dict 的 key 完全匹配且 value 不同,则更新为 a_dict 的 value
visited_keys = set()
for string in b_root.iter('string'):
 key = string.attrib['name']
 if key not in visited_keys:
 visited_keys.add(key)
 if key in a_dict and string.text != a_dict[key]: 
 # 使用正则表达式判断两个 key 是否完全一致
 pattern = f"^{key}$"
 is_matched = bool(re.match(pattern, key))
 if is_matched:
 string.text = a_dict[key]
# 保存修改后的 b.xml 文件
b_tree.write(args.output, encoding='utf-8', xml_declaration=True)
print(f"Successfully saved as {args.output}.")
作者:fuchsiaOS原文地址:https://www.cnblogs.com/imorning/p/17451216.html

%s 个评论

要回复文章请先登录注册