xmlstarlet: неверное выражение: ошибка компиляции [xpath]: элемент для каждого *

Вот мой 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*

Как мне получить конкретное значение в таком простом случае?


person Igor Elizarov    schedule 06.04.2016    source источник


Ответы (1)


Ваш XPath искажен. Используйте //*[@name='cpu.usage.average'] для -m в качестве исправления (а также для обхода пространств имен — иначе вам придется объявлять префикс пространства имен) и @value для -v.

В целом, эта команда xmlstarlet

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

вернется

3.4

для вашего XML в соответствии с запросом.

person kjhughes    schedule 06.04.2016