MacOS下如何用xmlstarlet更新XML文件的versionNumber值?
解决XMLStarlet无法处理带命名空间的XML问题
你遇到的核心问题是XML默认命名空间导致的——你的XML文件顶部定义了xmlns="http://ns.adobe.com/air/application/32.0",这意味着所有未指定前缀的元素都属于这个命名空间,而XMLStarlet的XPath查询默认只会匹配没有命名空间的元素,所以你的原始命令找不到versionNumber节点。
下面是分步解决方案:
1. 正确读取当前versionNumber值
需要在命令中用-N参数指定命名空间前缀(比如x),然后在XPath中使用这个前缀来定位元素:
xmlstarlet sel -N x="http://ns.adobe.com/air/application/32.0" -t -v "//x:versionNumber" ./Administrator-app.xml
运行这个命令应该就能正常输出当前的版本号(比如你的示例中的1)。
2. 自动递增并写回的Shell脚本
将读取、递增、更新整合到一个脚本里,适合在IntelliJ构建前执行:
#!/bin/bash XML_FILE="./Administrator-app.xml" NAMESPACE="http://ns.adobe.com/air/application/32.0" # 读取当前版本号 current_version=$(xmlstarlet sel -N x="$NAMESPACE" -t -v "//x:versionNumber" "$XML_FILE") # 递增版本号(确保当前值是整数,否则需要加判断) new_version=$((current_version + 1)) # 更新XML文件(-L参数直接修改原文件,不加则输出到终端) xmlstarlet edit -L -N x="$NAMESPACE" -u "//x:versionNumber" -v "$new_version" "$XML_FILE" echo "版本号已从 $current_version 递增到 $new_version"
脚本说明:
-L参数让XMLStarlet直接修改原文件,避免手动重定向输出;- 命名空间通过变量统一管理,后续如果Air版本更新(比如命名空间URL变化),只需修改
NAMESPACE变量即可; - 如果需要处理非整数的版本号(比如带小数点的),可以用
bc工具替代算术运算,比如new_version=$(echo "$current_version + 1" | bc)。
为什么你的原始命令失败?
XML的默认命名空间(没有前缀的xmlns)容易被忽略——当你用//versionNumber查询时,XPath会寻找没有任何命名空间的versionNumber元素,但你的实际元素都属于http://ns.adobe.com/air/application/32.0这个命名空间,所以匹配结果为空。
内容的提问来源于stack exchange,提问作者Sebastian Dwornik
相关产品推荐
相关产品推荐

