我正在编写一个 BASH 脚本来自动执行任务。但我遇到了这个问题,试图获取标记值,该值是标记<version>的直接子级<project>
XML 文件看起来像这样,
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1</version>
</parent>
<groupId>com.mycompany.app</groupId>
<artifactId>my-module</artifactId>
<version>1.2</version>
</project>
Run Code Online (Sandbox Code Playgroud)
我想要的<version>标签是<project>标签的直接子标签(在本例中值为 1.2)
我当前的代码是,
versions=($(grep -oP '(?<=<version>)[^<]+' "../../platform/pom.xml"))
echo ${versions[1]}
Run Code Online (Sandbox Code Playgroud)
我在其中获取所有<version>标签,然后选择第二个标签。但这不是正确的方法。正确的方法是选择该标签<version>的直接子标签<project>。
不要使用 grep 或 awk 从 XML 文件中提取值。如果您的系统上安装了 xpath,请发出:
xpath -q -e "/project/version/text()" file.xml
Run Code Online (Sandbox Code Playgroud)
version这将仅提取的直接后代节点下的文本节点的值project。
如果安装了 xmlstarlet,请运行:
xmlstarlet sel -t -m "/project/version" -v "text()" -n file.xml
Run Code Online (Sandbox Code Playgroud)
命令 xmllint 也可用于获得相同的结果:
xmllint --xpath "/project/version/text()" file.xml
Run Code Online (Sandbox Code Playgroud)