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}.")

Android strings.xml按照key修改的更多相关文章

  1. 不可不知的 Android strings.xml 那些事

    相信 strings.xml 已经是大家在 Android 开发中最熟悉的文件之一了,但其实它也有很多需要注意的地方和一些小技巧,知道了这些可以让你的 Android 应用更加规范易用,大家来看看吧. ...

  2. Android Strings.xml To CSV / Excel互转

    Android Strings.xml To CSV/Excel互转https://blog.csdn.net/hzxpyjq/article/details/50686983https://blog ...

  3. android strings.xml转义字符, 注意细节解决(转)

    XML转义字符 以下为XML标志符的数字和字符串转义符 "     (" 或 ") '     (' 或 ') &     (& 或 & ...

  4. 【转载】不可不知的 Android strings.xml 那些事

    相信 strings.xml 已经是大家在 Android 开发中最熟悉的文件之一了,但其实它也有很多需要注意的地方和一些小技巧,知道了这些可以让你的 Android 应用更加规范易用,大家来看看吧. ...

  5. (转载)ANDROID STRINGS.XML 中的特殊字符转义

    今天项目碰到个转义特殊字符的问题,网上搜索看到,故转载,已标明出处: 项目中要在string.xml 中显示特殊符号.如@号冒号等.直接写肯定不行啦 只能考虑使用ASCII码进行显示.在XML中空格符 ...

  6. Android strings.xml中定义字符串显示空格

    <string name="str">字 符 串</string> 其中   就表示空格.如果直接在里面键入空格,无论多少空格都只会显示一个. 用的XML转 ...

  7. android strings.xml 报 is not translated in af,

    57 down vote In your ADT go to window->Preferences->Android->Lint Error Checking Find there ...

  8. 修改Android中strings.xml文件, 动态改变数据

    有些朋友可能会动态的修改Android中strings.xml文件中的值,在这里给大家推荐一种简单的方法.strings.xml中节点是支持占位符的,如下所示: <string name=&qu ...

  9. 【我的Android进阶之旅】解决strings.xml格式化占位符错误: Multiple substitutions specified in non-positional format

    今天有一个Android新手使用strings.xml进行格式化的时候报了占位符错误, Multiple substitutions specified in non-positional forma ...

  10. 关于Android中res目录strings.xml文件中的转义字符之笔录

    res目录strings.xml文件中的转义字符:         ------------------>     代表着一个汉字的位置:                        ---- ...

随机推荐

  1. java创建线程的方式有几种?

    java中创建线程的方式有多少种,这个问题也是众多纷纭,这个时候更应该参考官方文档(https://docs.oracle.com/javase/8/docs/api/java/lang/Thread ...

  2. 六位一体Serverless化应用,帮你摆脱服务器的烦恼

    ​ 随着互联网技术的飞速发展,越来越多的应用横空出世,是以不可避免带来了大量的服务器需求.大部分的开发者都选择购买或者租用服务器,然而这样也带来了诸多的烦恼. 1.硬件成本高昂 购买服务器费用昂贵,除 ...

  3. arc076f F - Exhausted?

    ARC076 F - Exhausted? [题目大意] \(有m个座位,分别位于坐标为1,2,3,...,m的地方:n个客人,第i位客人只坐位于[0,li]∪[ri,m]的座位.每个座位只能坐一个人 ...

  4. 深度学习之PyTorch实战(5)——对CrossEntropyLoss损失函数的理解与学习

    其实这个笔记起源于一个报错,报错内容也很简单,希望传入一个三维的tensor,但是得到了一个四维. RuntimeError: only batches of spatial targets supp ...

  5. 四月八号java基础

    1.复合语句:JAVA语言不允许在两个嵌套的复合语句内声明同样的变量 2.注释:1)单行注释// 2)多行注释/*......*/3)/**......*/文件注释 3.else总是与之最近的if结构 ...

  6. Linux命令行与shell脚本编程(1)--读书笔记

    这里记录下个人读书笔记,持续更新中(作者小白,大佬轻喷... chap7 理解Linux文件权限 7.1 Linux安全性 Linux系统的每个用户账户都有唯一的用户ID,即UID,用户权限根据UID ...

  7. 关于页面重定向https安全漏洞和服务器SSH加密算法漏洞

    1.HTTP 严格传输安全 nginx配置 add_header Strict-Transport-Security "max-age=63072000; includeSubdomains ...

  8. 高阶组件——withRouter的原理和用法

    作用: 高阶组件中的withRouter, 作用是将一个组件包裹进Route里面, 然后react-router的三个对象history, location, match就会被放进这个组件的props ...

  9. ES6 新增的一些特性

    还有symbol和set,map, bind,call,apply 1. let关键字 (1)基本用法:let关键字用来声明变量,它的用法类似于var,都是用来声明变量. (2)块级作用域:let声明 ...

  10. 【解决方法】正常游览Flash页面,解决主流游览器的不支持问题(如Edge,Firefox)

    环境: 工具:360游览器-某特殊版本 系统版本:Windows 10 视频链接:[[解决方法]正常浏览flash页面,解决主流浏览器的不支持问题] https://www.bilibili.com/ ...