我试图从pom.xml中提取节点的值:
<?xml version="1.0" encoding="UTF-8"?> <project> <parent> <groupId>org.me.labs</groupId> <artifactId>my-random-project</artifactId> <version>1.5.0</version> </parent> ... </project>
我需要使用shell命令从XML中提取artifactId和version。我有以下要求/意见:
> shell脚本将在我们在工作中使用的构建程序集文件中完成,所以脚本越小越好。
>由于它将被用于多个系统(通常是RHEL5),我正在寻找可以在默认映像上本机运行的东西。
>标签可以发生在pom的其他地方,所以我不能简单地为这些标签awk。
我已经尝试过以下内容:
> xpath在我的Mac上工作,但默认情况下在RHEL机器上不可用。同样,对于xmllint –xpath,我猜这只是在以后的版本的xmllint中可用的,我没有,不能执行。
> xmllint –pattern似乎很有希望,但我似乎无法从xmllint –pattern’// project / parent / version’pom.xml(打印整个XML)或xmllint –stream –pattern’ // project / parent / version’pom.xml(no output)。
我意识到这是SO上的一个常见问题,但上面的几点是为什么我不能使用这些答案。 TIA为您的帮助。
我已经设法使用xmllint –shell来暂时解决这个非常不合脚本的脚本。
echo "cat //project/parent/version" | xmllint --shell pom.xml | sed '/^\/ >/d' | sed 's/<[^>]*.//g'
如果XML节点具有像我的pom.xml这样的命名空间属性,事情变得更重,基本上按照名称提取节点:
echo "cat //*[local-name()='project']/*[local-name()='parent']/*[local-name()='version']" | xmllint --shell pom.xml | sed '/^\/ >/d' | sed 's/<[^>]*.//g'
希望它有帮助。如果有人可以简单地表达这些表达,我将不胜感激。