使用xmlstarlet修改AndroidManifest的package属性失败求助
问题描述
我想用xmlstarlet修改AndroidManifest.xml里的package属性,输入文件内容如下:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.test.demoapp"> </manifest>
期望修改后输出:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.prod.demoapp"> </manifest>
我觉得问题出在命名空间上,试了两个命令都没效果,文件内容没变化:
带命名空间的命令:
xmlstarlet edit -N N="http://schemas.android.com/apk/res/android" \ --update "//N:manifest[@name='package']/@value" \ --value "com.prod.demoapp" $androidManifestXMLfile
不带命名空间的命令:
xmlstarlet edit \ --update "//manifest[@name='package']/@value" \ --value "test" $androidManifestXMLfile
正确解决方案
你的问题出在XPath表达式写错了,和命名空间无关——package属性本身不属于android命名空间,它是<manifest>标签的普通属性。
之前的XPath用了[@name='package']/@value是错误写法,正确的应该直接选中<manifest>标签的package属性。
正确的xmlstarlet命令如下:
xmlstarlet edit --update "//manifest/@package" --value "com.prod.demoapp" $androidManifestXMLfile
为什么之前的命令无效?
- 错误的XPath逻辑:你试图找带有
name='package'属性的<manifest>标签,再修改它的value属性,但实际上package就是<manifest>的直接属性,不存在name和value这两个中间属性。 - 命名空间误用:android命名空间只适用于
android:前缀的属性(比如android:minSdkVersion),而package是<manifest>的原生属性,不需要加命名空间前缀。
如果想要直接修改原文件(而非输出到控制台),可以加上--inplace参数:
xmlstarlet edit --inplace --update "//manifest/@package" --value "com.prod.demoapp" $androidManifestXMLfile
内容的提问来源于stack exchange,提问作者playerone
相关产品推荐
相关产品推荐

