xmlstarlet:表达式无效:[xpath]编译错误:元素for-each *

时间:2016-04-06 16:40:46

标签: xml bash xml-parsing xmlstarlet

有我的XML:

<?xml version="1.0" encoding="UTF-8"?>
<CurrentUsage xmlns="http://www.vmware.com/vcloud/v1.5" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.vmware.com/vcloud/v1.5 http://cloud.com/api/v1.5/schema/master.xsd">
    <Link rel="up" href="cloudurl" type="application/vnd.vmware.vcloud.vm+xml"/>
    <Metric name="cpu.usage.average" unit="PERCENT" value="3.4"/>
    <Metric name="cpu.usage.maximum" unit="PERCENT" value="3.4"/>
    <Metric name="cpu.usagemhz.average" unit="MEGAHERTZ" value="81.0"/>
    <Metric name="mem.usage.average" unit="PERCENT" value="15.99"/>
    <Metric name="disk.provisioned.latest" unit="KILOBYTE" value="503337805"/>
    <Metric name="disk.used.latest" unit="KILOBYTE" value="290391113"/>
</CurrentUsage>

我正在使用xmlstarlet工具,并且能够获取值列表:

xmlstarlet sel  -t -v //@value  test.xml

但我真的坚持用公制名称获取特定价值(作为“cpu.usage.average”的一个例子)。 我已经阅读了大量的例子,尝试使用如下表达式:

xmlstarlet sel  -t -m "//[@name='cpu.usage.average']" -v //@value test.xml

但这让我陷入了:

Invalid expression: //[@name='cpu.usage.average'] 
compilation error: element for-each*

如何在如此简单的情况下获得特定价值?

1 个答案:

答案 0 :(得分:1)

您的XPath格式不正确。使用//*[@name='cpu.usage.average']作为-m作为修复(并绕过名称空间 - 否则您必须声明名称空间前缀)和@value -v。 / p>

总而言之,这个xmlstarlet命令

xmlstarlet sel  -t -m "//*[@name='cpu.usage.average']" -v @value test.xml

将返回

3.4

,根据要求提供XML。