Подтвердить что ты не робот

Как я могу получить значение из атрибута с помощью xmllint и XPath?

Я хочу получить значение имени и поместить его в переменную с помощью XMLLint

<body>
<value name="abc"></value>
</body>

echo 'cat //body/value/@name' | xmllint --shell "test.xml"

/ >  -------
 name="abc"
/ > 

Итак, я хочу присвоить значение "abc" переменной $test

4b9b3361

Ответ 1

Вам нужно использовать fn: string(), который вернет значение своего аргумента как xs:string. Если аргумент является атрибутом, он возвращает значение атрибута как xs:string.

test=$(xmllint --xpath "string(//body/value/@name)" test.xml)

Ответ 2

Попробуйте это, это не красиво, но оно работает:)

Я просто стираю строки, содержащие > из stdout, вырезаю строку, чтобы получить вторую часть после =, и удалите "

test=$(echo 'cat //body/value/@name' | xmllint --shell "test.xml" | grep -v ">" | cut -f 2 -d "=" | tr -d \"); 
echo $test

Ответ 3

Недавно мне пришлось перенести мое первоначальное более простое решение с использованием --xpath на платформу, не имеющую этой функции, поэтому пришлось принять решение "cat". Это будет обрабатывать несколько совпадений, протестированных на Ubuntu 12.04 и Solaris 11:

getxml() { # $1 = xml file, $2 = xpath expression
    echo "cat $2" | xmllint --shell $1 |\
    sed -n 's/[^\"]*\"\([^\"]*\)\"[^\"]*/\1/gp'
}

например. извлечение имен экземпляров из конфига домена стеклянной рыбы:

$ getxml /tmp/test.xml "//server[@node-ref]/@name"
inst1
inst2

Последовательная обработка sed просто захватывает все приведенные значения, которые были адекватны моим потребностям (получение бит конфигурации из морской рыбы).

Ответ 4

Подход с командой помощник awk, которая поддерживает несколько атрибутов (упрощенная версия эго-подход):

echo 'cat //*/@name' | xmllint --shell file | awk -F\" 'NR % 2 == 0 { print $2 }'

Команда awk:

  • разделяет выходные строки xmllint на поля ". (-F\")

    • Обратите внимание, что xmllint нормализует цитирование значений атрибутов на "..." на выходе, даже если вход имеет '...', поэтому достаточно разделить на ".
  • обрабатывает только четные строки (NR %2 == 0), тем самым отфильтровывая линии разделителя, которые cat неизменно печатает.

  • print $2 затем печатает только второе поле, которое является значением каждого атрибута без прилагаемого "...".

Предполагая следующий образец XML в file:

<body>
  <value name="abc"></value>
  <value name="def"></value>
</body>

приведенное выше дает:

abc
def