2016-04-06 2 views
1

Существует мой XML:XMLStarlet: Недопустимое выражение: [XPath] ошибка компиляции: элемент, каждый *

<?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

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

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

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

вернется

3.4 

для XML, в соответствии с просьбой.

 Смежные вопросы

  • Нет связанных вопросов^_^