使用显示多个键的 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)
我有以下 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)