我有以下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>
有没有办法以所需的格式同时获取类和名称?
答案 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个属性。