Получение значения атрибута из XML в скрипте bash с помощью строки XPath () - PullRequest
0 голосов
/ 09 декабря 2018

Преамбула:
Это не дубликат, поскольку все другие темы не отвечают на мою конкретную проблему.
Я нахожусь на Xubuntu 18.04
с использованием libxml-xpath-perl 1.42 (если это имеет значение)

Проблема:
У меня есть XML, скажем так:

<root>
    <level1>
        <somechild foo="bar" />
    </level1>
</root

Я хочу получить значение bar из атрибута somechild s foo.Однако, когда я запрашиваю

FOO=$(xpath -e '/root/level1/somechild/@foo' $XMLFILE)"

в моем bash-скрипте, он возвращает foo="bar" вместо bar.

. Я уже исследовал эту проблему и обнаружил, что должен сделатьчто-то со строкой (), но я просто не могу понять, какой правильный синтаксис для этого.

Я пробовал функцию string () в разных местах, но самый близкий к успеху, до сих пор был

FOO="$(xpath -e 'string(/root/level1/somechild/@foo)' $XMLFILE)"

В этом случае echo $FOO дает мне

Запрос не вернул набор узлов.Значение: bar

Все еще не то, что я хочу, но, по крайней мере, без ошибок, и значение распознается как bar

Как правильно использовать это?

1 Ответ

0 голосов
/ 09 декабря 2018

С действительным XML:

xpath -e 'string(//root/level1/somechild/@foo)' file.xml 2>/dev/null 

или

xmlstarlet select --text --template --copy-of 'string(//root/level1/somechild/@foo)' file.xml

или

xmlstarlet select --text --template --match '//root/level1/somechild' --value-of '@foo' file.xml

Вывод:

bar
...