從 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

XML小星:

$ 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>

相關內容