Разбор XML с использованием xmllint, отображающий несколько ключей - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть следующий 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 голосов
/ 30 ноября 2018

Окончательное решение, которое я придумал, было:

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 атрибута вместо 2 в теге case(класс, имя, время)

0 голосов
/ 30 ноября 2018

Это невозможно с 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 в xmllint оболочка

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