使用xmllint解析XML以显示多个键

时间:2018-11-30 14:25:16

标签: xml xml-parsing xmllint

我有以下xml:

<suite>
<suite total="3" errors="2">
    <case class="abc" name="123">
        <error type="Error"></error>
    </case>
    <case class="abc" name="456">
    </case>
    <case class="abc" name="789">
        <error type="Error"></error>
    </case>
</suite>
<suite>
   ...
</suite>

我想提取信息,以便最终解决方案如下:

abc/123 abc/789

即如果错误标签存在,则打印class/name

我已经可以使用命令分别获取类或名称:

echo 'cat //suite[@errors!="0"]/case[error[@type="Error"]]/@name' | xmllint --shell <file-path>

有没有办法以所需的格式同时获取类和名称?

2 个答案:

答案 0 :(得分:1)

xmllint和XPath 1.0是不可能的,但是可以在bash的帮助下完成

echo 'ls //suite[@errors!="0"]/case[error[@type="Error"]]/@*' | xmllint --shell test.xml | gawk '/^ta/{ print $3 }' | sed '$!N;s/\n/\//'

结果:

abc/123
abc/789

基本上,它是在ls shell中解析xmllint的输出

ta-        3 abc
ta-        3 123
ta-        3 abc
ta-        3 789

答案 1 :(得分:1)

我想出的最终解决方案是:

failed=$(echo 'cat //suite[@errors!="0"]/case[error[@type="Error"]]/@*' | xmllint --shell <file-path> | awk '{if (NR %3 != 0) print $1 }' | awk '/^[nc]/' | awk -F'[="]' '{print $(NF-1)}'| awk '{if (NR%2!=0) printf " -i " $1; else printf "/"$1}')

所需的实际格式为-i class/name

此外,xml包含3个属性,而不是case标记(类,名称,时间)中的2个属性。