无法在 Shell 中解析 XML

Unable to Parse XML in Shell

所以,下面是我正在尝试解析的 xml。首先,我在我的 Jnekinsfile 中使用了 XmlSlurper,解析很容易,但我在管道中遇到了性能问题。 现在我正在使用 XMLlint,但它不像 XmlSlurper 那样简单:(

<metadata modelVersion="1.1.0">
  <groupId>com.test.test.test</groupId>
  <artifactId>myApp-ear</artifactId>
  <version>4.0.0-10-SNAPSHOT</version>
  <versioning>
    <snapshot>
      <timestamp>20200803.052228</timestamp>
      <buildNumber>3</buildNumber>
    </snapshot>
    <lastUpdated>20200803052228</lastUpdated>
    <snapshotVersions>
      <snapshotVersion>
        <extension>ear</extension>
        <value>4.0.0-10-20200803.052228-3</value>
        <updated>20200803052228</updated>
      </snapshotVersion>
      <snapshotVersion>
        <extension>pom</extension>
        <value>4.0.0-10-20200803.052228-3</value>
        <updated>20200803052228</updated>
      </snapshotVersion>
    </snapshotVersions>
  </versioning>
</metadata>

我想从 <snapshotVersion> with <extension> 类型 ear.

中解析并获取 <value>4.0.0-10-20200803.052228-3</value> 的值

这是我的代码片段,

 $(xmllint --xpath "/metadata/artifactId/text()"
 metadataFile)-$(xmllint --xpath
 "/metadata/versioning/snapshotVersions[0]/value/text()"
 metadataFile).$(xmllint --xpath
 "/metadata/versioning/snapshotVersions[0]/extension/text()"
 metadataFile)

输出:

++ xmllint --xpath '/metadata/artifactId/text()' metadataFile ++ xmllint --xpath '/metadata/versioning/snapshotVersions[0]/value/text()' metadataFile XPath set is empty ++ xmllint --xpath '/metadata/versioning/snapshotVersions[0]/extension/text()' metadataFile XPath set is empty

请帮忙。

提前致谢:)

面对这样的错误,我通常会开始尝试缩短我的 xpath 表达式,直到找到我在哪里获得了意外数据。您的完整表达式是:

/metadata/versioning/snapshotVersions[0]/value/text()

返回一个空集。如果我们改为尝试:

/metadata/versioning/snapshotVersions

我们看到这个returns:

<snapshotVersions>
      <snapshotVersion>
        <extension>ear</extension>
        <value>4.0.0-10-20200803.052228-3</value>
        <updated>20200803052228</updated>
      </snapshotVersion>
      <snapshotVersion>
        <extension>pom</extension>
        <value>4.0.0-10-20200803.052228-3</value>
        <updated>20200803052228</updated>
      </snapshotVersion>
    </snapshotVersions>

太棒了!但是,如果我们向其添加 [0],我们将再次得到空集:

$ xmllint --xpath '/metadata/versioning/snapshotVersions[0]' metadata.xml
XPath set is empty

有两个原因:

  1. 您需要将 [n] 运算符应用于构成列表的元素(因此,snapshotVersion,而不是 snapshotVersions),并且

  2. Xpath 从 1 而不是 0.

    开始枚举元素

所以这似乎可以满足您的要求:

$ xmllint --xpath '/metadata/versioning/snapshotVersions/snapshotVersion[1]/value/text()' metadata.xml
4.0.0-10-20200803.052228-3