从xmllint/xpath返回字符串

从xmllint/xpath返回字符串,xml,xpath,xmllint,xmlstarlet,Xml,Xpath,Xmllint,Xmlstarlet,我有以下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> <Nam

我有以下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>
但似乎一切都不起作用。这意味着XPath集是空的,如果我在--XPath参数中包含string(),那么它就不会返回任何内容

尝试此操作(忽略NS):

好了,不可能用--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 --xpath '//*[namespace-uri()="xmlns://www.fortifysoftware.com/schema/externalMetadata" and local-name()="Version"]/text()' file.xml
Finally更高级,它似乎是这里的合适工具:

xml sel -N x="xmlns://www.fortifysoftware.com/schema/externalMetadata" -t -m "//x:Version/text()" -c . -n file.xml
和奖励(使用XPath 3的可用性)

尝试此操作(忽略NS):

好了,不可能用--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 --xpath '//*[namespace-uri()="xmlns://www.fortifysoftware.com/schema/externalMetadata" and local-name()="Version"]/text()' file.xml
Finally更高级,它似乎是这里的合适工具:

xml sel -N x="xmlns://www.fortifysoftware.com/schema/externalMetadata" -t -m "//x:Version/text()" -c . -n file.xml
和奖励(使用XPath 3的可用性)

尝试此操作(忽略NS):

好了,不可能用--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 --xpath '//*[namespace-uri()="xmlns://www.fortifysoftware.com/schema/externalMetadata" and local-name()="Version"]/text()' file.xml
Finally更高级,它似乎是这里的合适工具:

xml sel -N x="xmlns://www.fortifysoftware.com/schema/externalMetadata" -t -m "//x:Version/text()" -c . -n file.xml
和奖励(使用XPath 3的可用性)

尝试此操作(忽略NS):

好了,不可能用--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 --xpath '//*[namespace-uri()="xmlns://www.fortifysoftware.com/schema/externalMetadata" and local-name()="Version"]/text()' file.xml
Finally更高级,它似乎是这里的合适工具:

xml sel -N x="xmlns://www.fortifysoftware.com/schema/externalMetadata" -t -m "//x:Version/text()" -c . -n file.xml
和奖励(使用XPath 3的可用性)



您想要获取什么?您的XPath似乎完全错误我正在查找标记的内容,在本例中为2014.4.0.0008。您想要获取什么?您的XPath似乎完全错误我正在查找标记的内容,在本例中为2014.4.0.0008。您想要获取什么?您的XPath似乎完全错误我正在查找标记的内容在本例中为2014.4.0.0008。您想获取什么?您的XPath似乎完全错误。我正在查找标记的内容,在本例中为2014.4.0.0008。这很有效,但我不知道为什么。有没有一种方法可以使解决方案更容易地适用于其他元素(例如将命名空间设置为根元素而不是特定元素)?@sputnick与其推荐
local-name()
,不如展示在
xmllint
中声明和使用命名空间的工作原理。忽略名称空间很少是一个好的选择哎呀&--c、 /^-------$/{c=1}'从xmllint的输出中删除垃圾。提供的一些其他解决方案似乎更感谢您的帮助。昨晚我花了太多时间研究这个问题,得出了相同的结论,如果你想设置NS,你必须进入xlint shell(我不想这样做,因为这是在脚本中)。这是可行的,尽管我不知道为什么。有没有一种方法可以使解决方案更容易地适用于其他元素(例如将命名空间设置为根元素而不是特定元素)?@sputnick与其推荐
local-name()
,不如展示在
xmllint
中声明和使用命名空间的工作原理。忽略名称空间很少是一个好的选择哎呀&--c、 /^-------$/{c=1}'从xmllint的输出中删除垃圾。提供的一些其他解决方案似乎更感谢您的帮助。昨晚我花了太多时间研究这个问题,得出了相同的结论,如果你想设置NS,你必须进入xlint shell(我不想这样做,因为这是在脚本中)。这是可行的,尽管我不知道为什么。有没有一种方法可以使解决方案更容易地适用于其他元素(例如将命名空间设置为根元素而不是特定元素)?@sputnick与其推荐
local-name()
,不如展示在
xmllint
中声明和使用命名空间的工作原理。忽略名称空间很少是一个好的选择哎呀&--c、 /^-------$/{c=1}'从xmllint的输出中删除垃圾。提供的一些其他解决方案似乎更感谢您的帮助。昨晚我花了太多时间研究这个问题,得出了相同的结论,如果你想设置NS,你必须进入xlint shell(我不想这样做,因为这是在脚本中)。这是可行的,尽管我不知道为什么。有没有一种方法可以使解决方案更容易地适用于其他元素(例如将命名空间设置为根元素而不是特定元素)?@sputnick与其推荐
local-name()
,不如展示在
xmllint
中声明和使用命名空间的工作原理。忽略名称空间很少是一个好的选择哎呀&--c、 /^-------$/{c=1}'从xmllint的输出中删除垃圾。提供的一些其他解决方案似乎更感谢您的帮助。昨晚我花了太多时间研究这个问题,得出了同样的结论,如果你想设置NS,你必须进入xlint shell(我不想这样做,因为这是在一个脚本中)。