Как получить все атрибуты с одинаковым именем тега с помощью xmllint xpath - PullRequest
0 голосов
/ 12 февраля 2020

Образец xml -

<xml>
<Tag name="attr1"></Tag>
<Tag name="attr2"></Tag>
<Tag name="attr2"></Tag>
</xml>

Как получить значения всех атрибутов с помощью xmllint, например:

attr1
attr2
attr3

Я могу использовать только xmllint. Я пробовал это-

xmllint --xpath 'string(//Tag/@name)'

Но это возвращает только первый матч.

1 Ответ

1 голос
/ 12 февраля 2020

Использование string() даст вам только первое совпадение в XPath 1.0. Если вы удалите string(), вы получите все три атрибута, но вам придется постобработать их, чтобы получить только значения. Я полагаю, это будет зависеть от того, как вы используете xmllint (что такое os / shell / et c).

Что-то вроде (протестировано с bash в cygwin) ...

attrs=$(xmllint --xpath "//Tag/@name" sample.xml)
echo $attrs | sed 's/\s*name="\([^"]*\)"/\1\n/g'

Другой вариант - сначала получить счетчик количества Tag элементов, а затем вызвать xmllint столько раз с позиционным предикатом на Tag.

Что-то вроде (проверено с bash в cygwin ) ...

count=$(xmllint --xpath "count(//Tag)" sample.xml)

if [[ $count != 0 ]]; then
    for ((i=1; i<=$count; i++)); do
       echo $(xmllint --xpath "string(//Tag[$i]/@name)" sample.xml)
    done
fi
...