从xmllint / xpath返回字符串

时间:2015-01-11 02:40:07

标签: xml xpath xmllint

我有以下xml摘录,我想要的只是Version标签中的字符串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(),那么它就不会返回任何内容。

1 个答案:

答案 0 :(得分:3)

试试这个(忽略NS):

xmllint --xpath '//*[local-name()="Version"]/text()' file.xml

AFAIK,使用--xpath开关设置默认NS是不可能的,所以使用--shell one:

$ 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

最后更加先进,它似乎是正确的工具:

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