脚本:提取 XML 文件标签中的值最容易的方法是什么?

脚本:提取 XML 文件标签中的值最容易的方法是什么?

我想读取 pom.xml (Maven 的“项目对象模型”) 并提取版本信息。以下是示例:

<?xml version="1.0" encoding="UTF-8"?><project 
xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <groupId>com.mycompany</groupId>
    <artifactId>project-parent</artifactId>
    <name>project-parent</name>
    <version>1.0.74-SNAPSHOT</version>
    <dependencies>
        <dependency>
        <groupId>com.sybase.jconnect</groupId>
        <artifactId>jconnect</artifactId>
        <version>6.05-26023</version>
    </dependency>
    <dependency>
        <groupId>joda-time</groupId>
        <artifactId>joda-time</artifactId>
        <version>1.5.2</version>
    </dependency>
    <dependency>
        <groupId>com.sun.jdmk</groupId>
        <artifactId>jmxtools</artifactId>
        <version>1.2.1</version>
    </dependency>
    <dependency>
        <groupId>org.easymock</groupId>
        <artifactId>easymock</artifactId>
        <version>2.4</version>
    </dependency>       
</dependencies>
</project>

我如何从上面提取版本“1.0.74-SNAPSHOT”?

希望能够使用简单的 bash 脚本 sed 或 awk 来实现这一点。否则,最好使用简单的 python。

编辑

  1. 约束

    Linux 机器位于企业环境中,因此我只能使用已安装的工具(并不是说我不能请求 xml2 等实用程序,而是我必须经过很多繁琐的手续)。有些解决方案非常好(已经学到了一些新技巧),但由于环境受限,它们可能不适用

  2. 更新了 xml 列表

    我在原始列表中添加了依赖项标签。这将表明某些黑客解决方案在这种情况下可能不起作用

  3. 发行版

    我使用的发行版是 RHEL4

答案1

xml2 可以将 xml 转换为行导向格式或从行导向格式转换:

xml2 < pom.xml  | grep /project/version= | sed 's/.*=//'

答案2

其他方法:xmlgrep 和 XPath:

xmlgrep --text_only '/project/version' pom.xml

缺点:速度慢

答案3

使用python

$ python -c 'from xml.etree.ElementTree import ElementTree; print ElementTree(file="pom.xml").findtext("{http://maven.apache.org/POM/4.0.0}version")'
1.0.74-SNAPSHOT

使用xmlstarlet

$ xml sel -N x="http://maven.apache.org/POM/4.0.0" -t -m 'x:project/x:version' -v . pom.xml
1.0.74-SNAPSHOT

使用xmllint

$ echo -e 'setns x=http://maven.apache.org/POM/4.0.0\ncat /x:project/x:version/text()' | xmllint --shell pom.xml | grep -v /
1.0.74-SNAPSHOT

答案4

这是 Perl 中的替代方案

$ perl -MXML::Simple -e'print XMLin("pom.xml")->{version}."\n"'
1.0.74-SNAPSHOT

它适用于问题中的修订/扩展示例,该示例具有不同深度的多个“版本”元素。

相关内容