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

Parse XML using xmllint displaying multiple keys

我有以下 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

我已经能够使用以下命令分别获取 class 或名称:

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

有没有办法让 class 和名称都符合要求的格式?

使用 xmllint 和 XPath 1.0 是不可能的,但可以在 bash

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

结果:

abc/123
abc/789

基本上,它是在 xmllint shell

中解析 ls 的输出
ta-        3 abc
ta-        3 123
ta-        3 abc
ta-        3 789

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

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

实际需要的格式是-i class/name

此外,xml 包含 3 个属性,而不是 case 标签中的 2 个属性 (class,name,time)