Extraia valor do XML

Extraia valor do XML

Eu tenho esse XML:

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

Quero extrair o 20.3817.

Tentando um pouco de sed, mas não conseguindo trabalhar.

Responder1

Não use expressões regulares para analisar XML. Use uma ferramenta compatível com XML, por exemplo xmllint:

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

Responder2

ComXMLStarlet:

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

Responder3

Utilize lxprintf:

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

Responder4

Você estaria muito, muito melhor usando uma ferramenta compatível com XML

Se realmente for um caso simples de extrair o valor do timeatributo você pode usar sed. Como você verá na maioria das respostas aqui, a melhor abordagem é usar uma ferramenta que entenda XML, mas para casos realmente simples vocêpode escapar impuneusando 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

Ougrep

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

MasEu ainda preferiria algo compatível com XML comoxmlstarlet, que pode ser reconhecido timecomo um atributo de <testcase>.

informação relacionada