无法在 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
有两个原因:
您需要将 [n]
运算符应用于构成列表的元素(因此,snapshotVersion
,而不是 snapshotVersions
),并且
Xpath 从 1
而不是 0
.
开始枚举元素
所以这似乎可以满足您的要求:
$ xmllint --xpath '/metadata/versioning/snapshotVersions/snapshotVersion[1]/value/text()' metadata.xml
4.0.0-10-20200803.052228-3
所以,下面是我正在尝试解析的 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
有两个原因:
您需要将
[n]
运算符应用于构成列表的元素(因此,snapshotVersion
,而不是snapshotVersions
),并且Xpath 从
开始枚举元素1
而不是0
.
所以这似乎可以满足您的要求:
$ xmllint --xpath '/metadata/versioning/snapshotVersions/snapshotVersion[1]/value/text()' metadata.xml
4.0.0-10-20200803.052228-3