Извлечь значение из XML

Извлечь значение из XML

У меня есть этот XML:

<results><testsuites><testcase name="XXXX (XXXXX)" time="20.3817"><result>success</result></testcase><total_time value="20.3830" /></testsuites></results>

Я хочу извлечь 20.3817.

Пробую sed, но не получается.

решение1

Не используйте регулярные выражения для разбора XML. Используйте инструмент, поддерживающий XML, например xmllint:

xmllint --xpath 'string(/results/testsuites/testcase/@time)' file.xml

решение2

СXMLStarlet:

$ xmlstarlet sel -t -v '//testcase/@time' -nl data.xml
20.3817

решение3

Используйте lxprintf:

lxprintf -e "%s\n" total_time/@value test.xml

решение4

Было бы гораздо, гораздо лучше использовать инструмент, поддерживающий XML.

Если это действительно простой случай извлечения значения атрибута, timeвы можете использовать sed. Как вы увидите из большинства ответов здесь, лучшим подходом на самом деле будет использование инструмента, который понимает XML, но для действительно простых случаев выможет сойти с рукс использованием sed.

xml='<results><testsuites><testcase name="XXXX (XXXXX)" time="20.3817"><result>success</result></testcase><total_time value="20.3830" /></testsuites></results>'
echo "$xml" | sed -nr 's/.* time="([0-9.]+).*/\1/p'    # GNU
28.3817
echo "$xml" | sed -n 's/.* time="\([0-9.]*\).*/\1/p'   # Non-GNU
28.3817

Илиgrep

echo "$xml" | grep -Po '(?<=time=")([0-9.]+)'          # GNU
20.3817

НоЯ бы все же предпочел что-то с поддержкой XML, напримерxmlstarlet, который может распознавать timeкак атрибут <testcase>.

Связанный контент