Extraer valor de XML

Extraer valor de XML

Tengo este XML:

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

Quiero extraer el 20.3817.

Probando un poco de sed pero no poniéndome a trabajar.

Respuesta1

No utilice expresiones regulares para analizar XML. Utilice una herramienta compatible con XML, por ejemplo xmllint:

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

Respuesta2

ConXMLStarlet:

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

Respuesta3

Utilice lxprintf:

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

Respuesta4

Sería mucho, mucho mejor si usara una herramienta compatible con XML

Si realmente es un caso simple de extraer el valor del timeatributo, puedes usar sed. Como verá en la mayoría de las respuestas aquí, el mejor enfoque es utilizar una herramienta que entienda XML, pero para casos realmente simples,podría salirse con la suyausando 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

Ogrep

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

PeroTodavía prefiero algo compatible con XML comoxmlstarlet, que puede reconocerse timecomo un atributo de <testcase>.

información relacionada