XML:使用 BASH 脚本提取直接子标签

kun*_*nal -1 xml bash

我正在编写一个 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>

Pie*_*ois 5

不要使用 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)