Игнорировать пространство имен в селекторе xpath не работает - PullRequest
1 голос
/ 15 марта 2020

У меня есть XML ниже и я хочу выбрать значение атрибута name элемента category.

Я посмотрел здесь и здесь и здесь .

Я на самом деле хочу xpath 1.0, поэтому я попытался:
/result/products/product/*:[local-name() = 'categories']/*:[local-name() = 'category']/@name

Так как это не сработало, я также просто попытался xpath 2.0 :
/result/products/product/*:categories/*:category/@name

Если я удаляю префиксы пространства имен из исходного документа, селектор /result/products/product/categories/category/@name возвращает правильное значение.

Итак, как я могу игнорировать пространства имен в моих селекторах? ?

<result version="3.0"
    xmlns="urn:com:tradedoubler:pf:model:xml:output"
    xmlns:ns2="urn:com:tradedoubler:pf:model:xml:common">
    <products>
        <product>
            <ns2:name>MY name</ns2:name>
            <ns2:productImage>https://www.google.com/assets/1400x1960/1519833875/18053428-6dv7qPqW.jpg</ns2:productImage>
            <ns2:categories>
                <ns2:category name="Living&gt;Curtains&gt;Curtains"></ns2:category>
            </ns2:categories>

        </product>
    </products>
</result>

Ответы [ 3 ]

2 голосов
/ 15 марта 2020

Ваше выражение XPath неверно: в вашем выражении есть лишнее :, и вам также необходимо принять во внимание пространство имен по умолчанию xmlns="urn:com:tradedoubler:pf:model:xml:output", которое влияет на все дочерние элементы элемента <result>.

Поэтому используйте следующее выражение:

/*[local-name() = 'result']/*[local-name() = 'products']/*[local-name() = 'product']/*[local-name() = 'categories']/*[local-name() = 'category']/@name
0 голосов
/ 15 марта 2020

[code]/*:result/*:products/*:product/*:categories/*:category/@name[/code]

0 голосов
/ 15 марта 2020

В вашем XML все элементы, которые не имеют префикса пространства имен, находятся в пространстве имен по умолчанию: xmlns = "urn: com: tradedoubler: pf: model: xml: output".

Так что вам нужно исправить свой xpath, чтобы представить это пространство имен. Для этого рекомендуется использовать дополнительный префикс пространства имен, например:

xmlns:o="urn:com:tradedoubler:pf:model:xml:output"

Ваш xpath становится:

/o:result/o:products/o:product/*:[local-name() = 'categories']/*:[local-name() = 'category']/@name

Вы также можете использовать пространство имен ns2:

/o:result/o:products/o:product/ns2:categories/ns2:category/@name
...