![Extraer valor de XML](https://rvso.com/image/83672/Extraer%20valor%20de%20XML.png)
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 time
atributo, 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 time
como un atributo de <testcase>
.