在Android开发中,有时候会碰到一个游戏有很多版本,很多渠道。而不同版本对应的AndroidManifest.xml的内容往往都不一样,这个时候用脚本来修改AndroidManifest.xml是一个不错的选择。这样可以避免每次切换版本都需要手动修改,或者使用git创建一堆分支。
推荐使用 python的 xml.etree.ElementTree 库来解析xml文件
如果是AndroidManifest.xml,注意在 parse 前 一定要设置namespace, 不然就会出现 ns0:name错误, 而不是预期的 android:name,设置namespace的方法
ET.register_namespace('android', "http://schemas.android.com/apk/res/android")
使用库
try:
import xml.etree.cElementTree as ET
except ImportError:
import xml.etree.ElementTree as ET
解析时传入xml文件路径即可
ET.register_namespace('android', "http://schemas.android.com/apk/res/android")
path="../../demo/AndroidManifest.xml"
tree = ET.parse(path) #打开xml文档
root = tree.getroot() #获得root节点
还有一个接口是解析时传入字符串
ET.register_namespace('android', "http://schemas.android.com/apk/res/android")
plugin_root = ET.fromstring(xml_string)
获取包名
package_name=root.get('package')
设置包名,设置完成后要记得 写回去,不然下次再解析就又是以前的内容了
root.set('package', package_name)
tree.write(path)
遍历并插入,即将两个AndroidManifest.xml的权限声明的内容合到一起
for child in root:
if child.tag == u'uses-permission':
for plugin_child in plugin_root:
if plugin_child.tag == u'uses-permission':
root.insert(-1,plugin_child)
删除
root.remove(child)
另外,删除节点时要注意:
另外,可以用list来保存要删除的节点
remove_child = list()
remove_child.append(child)