## strings.xml匹配替換 將兩個Android項目中的多語言字元串文件(strings.xml)進行比較,如果其中一個項目中包含另一個項目沒有的字元,則合併到單一的輸出文件,並以 key 在原始 XML 文件中更新 value 值。如果key匹配不准確則忽略它。 具體來說: 1. 引入 ...
strings.xml匹配替換
將兩個Android項目中的多語言字元串文件(strings.xml)進行比較,如果其中一個項目中包含另一個項目沒有的字元,則合併到單一的輸出文件,並以 key 在原始 XML 文件中更新 value 值。如果key匹配不准確則忽略它。
具體來說:
- 引入 re, xml.etree.ElementTree 和 argparse 模塊。
- 定義命令行參數 parser。
- 解析輸入、源和輸出XML文件,並得到其 root 節點。
- 將所有 a.xml 中的 key-value 存儲在字典 a_dict 中。
- 遍歷 b.xml 的 string 標簽,使用正則表達式判斷每個鍵是否與a_dict相等且值不同,然後更新為a_dict中的值。
- 保存修改後的b_tree到指定的輸出路徑。
- 列印成功執行修改操作的消息。
該代碼涉及解析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}.")