0

次の 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() を含めると、何も返されません。

4

1 に答える 1

4

これを試してください(NSを無視して):

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

私の知る限り、 --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
于 2015-01-11T02:54:57.357 に答える