xmllint / Xpath извлекает родительский узел, где дочерний элемент содержит текст из ленты покупок Google

Я пытаюсь извлечь все узлы элементов, содержащие g:custom_label_0 с текстовым значением 2020-2021 Пока мне удается найти все узлы, содержащие дочерний элемент g:custom_label_0, но мне не удается отфильтровать по текстовому значению поля .

Вот пример XML:

   <item>
        <description>[...]</description>
        <g:availability>in stock</g:availability>
        <g:brand>Barts</g:brand>
        <g:condition>new</g:condition>
        <g:custom_label_0>2020-2021</g:custom_label_0>
        <g:id>108873/10-3</g:id>
        <g:image_link>[...]</g:image_link>
        <g:price>26.99 EUR</g:price>
        <g:sale_price>26.99 EUR</g:sale_price>
        <g:shipping>
            <g:country>NL</g:country>
            <g:price>4.50 EUR</g:price>
        </g:shipping>
        <g:shipping_weight>7.95</g:shipping_weight>
        <link>[....]</link>
    </item>
   ...

Есть узлы, содержащие значения, отличные от 2020-2021, но я хочу извлечь все полные узлы элементов, содержащие этот текст. Вот что я сделал, чтобы извлечь все узлы, имеющие доступное поле.

xmllint --xpath '//item["g:custom_label_0"]' myfile.xml 

я попытался добавить текстовый фильтр с помощью квадратных скобок и т. д., но у меня есть ощущение, что цитата вокруг custom_label_0 может вызвать проблемы. Добавление дополнительных фильтров в кавычки принимается (без ошибок), но я не смогу добавить больше кавычек внутри для фильтрации строки.

Работает, ошибок не выдает:

xmllint --xpath '//item["g:custom_label_0[text()]"]' myfile.xml 

Если бы я хотел отфильтровать текст сейчас, мне нужно было бы снова использовать кавычки. Выход из них нарушает код. Как я могу дополнительно отфильтровать текст 2020-2021, когда оба типа кавычек уже используются?


person Kai    schedule 23.10.2020    source источник


Ответы (1)


Ты прав; кавычки вокруг g:custom_label_0 вызывают проблемы. Это делает его строкой, и это всегда верно, поэтому он вернет все элементы item.

g: — это префикс пространства имен. Чтобы привязать пространство имен к префиксу в xmllint, вы должны использовать его в режиме оболочки (см. https://stackoverflow.com/a/8266075/317052 для примера).

В качестве альтернативы можно проверить имя элемента, чтобы выбрать элемент g:custom_label_0, а затем проверить значение этого элемента, чтобы увидеть, является ли он 2020-2021.

Пример...

xmllint --xpath '//item[*[name()="g:custom_label_0"][.="2020-2021"]]' myfile.xml
person Daniel Haley    schedule 23.10.2020