Wert aus XML extrahieren

Wert aus XML extrahieren

Ich habe dieses XML:

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

Ich möchte die 20,3817 extrahieren.

Ich versuche es mit etwas Sed, aber es funktioniert nicht.

Antwort1

Verwenden Sie keine regulären Ausdrücke zum Parsen von XML. Verwenden Sie ein XML-fähiges Tool, z . B xmllint.:

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

Antwort2

MitXMLStarlet:

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

Antwort3

Verwenden Sie lxprintf:

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

Antwort4

Mit einem XML-fähigen Tool wären Sie weitaus besser bedient

Wenn es wirklich nur darum geht, den Wert des timeAttributs zu extrahieren, können Sie verwenden sed. Wie Sie aus den meisten Antworten hier sehen werden, ist der bessere Ansatz, ein Tool zu verwenden, das XML versteht, aber für wirklich einfache Fälle müssen Siekönnte davonkommenmit 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

Odergrep

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

AberIch würde immer noch etwas XML-fähiges bevorzugen wiexmlstarlettime, das als Attribut von erkennen kann <testcase>.

verwandte Informationen