【问题标题】:Unable to Parse XML in Shell无法在 Shell 中解析 XML
【发布时间】:2020-11-23 12:47:28
【问题描述】:

所以,下面是我要解析的 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>

我想从&lt;snapshotVersion&gt; with &lt;extension&gt;类型ear解析和获取&lt;value&gt;4.0.0-10-20200803.052228-3&lt;/value&gt;的值。

这是我的代码 sn-p,

 $(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()' 元数据文件 ++ xmllint --xpath '/metadata/versioning/snapshotVersions[0]/value/text()' 元数据文件 XPath 集为空 ++ xmllint --xpath '/metadata/versioning/snapshotVersions[0]/extension/text()' metadataFile XPath 集为空

请帮忙。

在此先感谢 :)

【问题讨论】:

  • //snapshotVersion[extension="ear"]/value/text() 不适合你吗?

标签: xml shell xpath xmllint


【解决方案1】:

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

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

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

/metadata/versioning/snapshotVersions

我们看到这个返回:

<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

【讨论】:

  • 这成功了!非常感谢关于 xmllint @larsks 的解决方案和很好的见解。
猜你喜欢
  • 2017-05-06
  • 1970-01-01
  • 2021-05-07
  • 2013-08-06
  • 1970-01-01
  • 2023-03-09
  • 2016-04-07
  • 1970-01-01
  • 2014-01-08
相关资源
最近更新 更多