Как с помощью xmlstarlet запросить у тега два значения атрибута?

Если ваш сокет относится к семейству адресов AF _INET, то это tcp4вnetstat

netstat: tcp4       0      0  *.57312                *.*                    LISTEN

Если ваш сокет относится к семейству адресов AF _INET6, то это зависит от IPV6_V6ONLYопции:

int v6only= 0;
setsockopt (s, IPPROTO_IPV6, IPV6_V6ONLY, &ipv6only, sizeof ipv6only);

netstat: tcp        0      0  *.57313                *.*                    LISTEN

, если этот параметр установлен

int v6only= 1;
setsockopt (s, IPPROTO_IPV6, IPV6_V6ONLY, &ipv6only, sizeof ipv6only);

netstat: tcp6       0      0  *.57314                *.*                    LISTEN
1
28.11.2021, 22:01
2 ответа
the_id='cover'
the_mediatype_prefix='image/'

xmlstarlet sel -t \
    --var queryid="'$the_id'" \
    --var typeprefix="'$the_mediatype_prefix'" \
    -v '//item[@id = $queryid and starts-with(@media-type, $typeprefix)]/@href' \
    -nl file.xml

Это запрашивает файл XML, используя две переменные оболочки. Переменная the_idсодержит значение атрибута id, с которым мы фильтруем, а the_mediatype_prefixсодержит строку, с которой должен начинаться атрибут media-type.

Мы создаем две внутренние переменные для xmlstarlet, используя опцию инструмента --var. Значения должны быть закодированными значениями, поэтому я заключаю их в одинарные кавычки (это немного хак, в идеале они должны быть правильно закодированными строками XPath, но это немного лучше, чем вставлять переменные оболочки непосредственно в выражение ).

Выражение XPath выбирает атрибут hrefкаждого узла item, который имеет соответствие idи media-type.


Использованиеxq(XML-оболочки синтаксического анализатора вокруг jqвместо этого синтаксического анализатора JSON ):

the_id='cover'
the_mediatype_prefix='image/'

xq -r \
    --arg queryid "$the_id" \
    --arg typeprefix "$the_mediatype_prefix" '
   .. |.item? |
    select(
       ."@id" == $queryid and
        (."@media-type" | startswith($typeprefix))
    )."@href"' file.xml

Это более или менее идентично коду xmlstarlet, за исключением использования выражения jqвместо запроса XPath. Здесь утилита позаботится о правильном кодировании ваших переменных оболочки, даже если они содержат неверные значения, такие как кавычки и т. д. (значения переменных оболочки в примере xmlstarletдолжны быть закодированы вручную, если они содержат недопустимые последовательности символов ). ].

3
29.11.2021, 08:17

Вы можете добавить несколько условий:

xmlstarlet sel -t -m "//item[@id='cover'][starts-with(@media-type,'image/')]" -v '@href' -nl file.xml
2
29.11.2021, 14:29

Теги

Похожие вопросы