从 xmllint/xpath 返回字符串
Returning string from xmllint/xpath
我有以下 xml 摘录,我想要的只是版本标记中的字符串 2014.4.0.0008。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ExternalMetadataPack xmlns="xmlns://www.fortifysoftware.com/schema/externalMetadata" schemaVersion="1.0">
<PackInfo>
<Name>Main External List Mappings</Name>
<PackID>main-external-mappings</PackID>
<Version>2014.4.0.0008</Version>
</PackInfo>
</ExternalMetadataPack>
我已经尝试了一些事情并得到了这样的结果:
xmllint --xpath "//PackInfo/@Version[local-name()='ExternalMetadataPack']" externalmetadata.xml
但似乎没有任何效果。这表示 XPath 集是空的,如果我在 --xpath 参数中包含 string() ,那么它不会 return 任何东西。
试试这个(忽略 NS):
xmllint --xpath '//*[local-name()="Version"]/text()' file.xml
AFAIK,无法使用 --xpath 开关设置默认 NS,因此使用 --shell 一个 :
$ xmllint --shell file.xml <<EOF
setns x=xmlns://www.fortifysoftware.com/schema/externalMetadata
cat //x:Version/text()
EOF
/ > setns x=xmlns://www.fortifysoftware.com/schema/externalMetadata
/ > cat //x:Version/text()
-------
2014.4.0.0008
/ >
但遗憾的是,输出中有垃圾,所以:
$ xmllint --shell file.xml <<EOF | grep -Ev '^(/ *>| --+)'
setns x=xmlns://www.fortifysoftware.com/schema/externalMetadata
cat //x:Version/text()
EOF
输出:
2014.4.0.0008
另一种方式:
xmllint --xpath '//*[namespace-uri()="xmlns://www.fortifysoftware.com/schema/externalMetadata" and local-name()="Version"]/text()' file.xml
最后 xmlstarlet 更高级,它似乎是合适的工具:
xml sel -N x="xmlns://www.fortifysoftware.com/schema/externalMetadata" -t -m "//x:Version/text()" -c . -n file.xml
还有奖励(可以使用 XPath 3)saxon-lint
saxon-lint --xpath 'declare default element namespace "xmlns://www.fortifysoftware.com/schema/externalMetadata";//Version/text()' file.xml
我有以下 xml 摘录,我想要的只是版本标记中的字符串 2014.4.0.0008。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ExternalMetadataPack xmlns="xmlns://www.fortifysoftware.com/schema/externalMetadata" schemaVersion="1.0">
<PackInfo>
<Name>Main External List Mappings</Name>
<PackID>main-external-mappings</PackID>
<Version>2014.4.0.0008</Version>
</PackInfo>
</ExternalMetadataPack>
我已经尝试了一些事情并得到了这样的结果:
xmllint --xpath "//PackInfo/@Version[local-name()='ExternalMetadataPack']" externalmetadata.xml
但似乎没有任何效果。这表示 XPath 集是空的,如果我在 --xpath 参数中包含 string() ,那么它不会 return 任何东西。
试试这个(忽略 NS):
xmllint --xpath '//*[local-name()="Version"]/text()' file.xml
AFAIK,无法使用 --xpath 开关设置默认 NS,因此使用 --shell 一个 :
$ xmllint --shell file.xml <<EOF
setns x=xmlns://www.fortifysoftware.com/schema/externalMetadata
cat //x:Version/text()
EOF
/ > setns x=xmlns://www.fortifysoftware.com/schema/externalMetadata
/ > cat //x:Version/text()
-------
2014.4.0.0008
/ >
但遗憾的是,输出中有垃圾,所以:
$ xmllint --shell file.xml <<EOF | grep -Ev '^(/ *>| --+)'
setns x=xmlns://www.fortifysoftware.com/schema/externalMetadata
cat //x:Version/text()
EOF
输出:
2014.4.0.0008
另一种方式:
xmllint --xpath '//*[namespace-uri()="xmlns://www.fortifysoftware.com/schema/externalMetadata" and local-name()="Version"]/text()' file.xml
最后 xmlstarlet 更高级,它似乎是合适的工具:
xml sel -N x="xmlns://www.fortifysoftware.com/schema/externalMetadata" -t -m "//x:Version/text()" -c . -n file.xml
还有奖励(可以使用 XPath 3)saxon-lint
saxon-lint --xpath 'declare default element namespace "xmlns://www.fortifysoftware.com/schema/externalMetadata";//Version/text()' file.xml