python解析AndroidManifest.xml文件

在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)

另外,删除节点时要注意:

  1. 遍历第一遍,找出要删除的节点并保存, 第二遍,再删除。 如果一边遍历,一边删除,是删不掉的。
  2. root调用remove只能删除一级子节点,即只能删除调用节点的下一级节点,如果要删除2级子节点,则要用 child.remove(grand_child)
  3. 例如要删除一个activity,应该遍历root获取application节点,再遍历application获取对应activity节点才行

另外,可以用list来保存要删除的节点

remove_child = list()
remove_child.append(child)

你可能感兴趣的:(python)