忽略 xpath 选择器中的名称空间不起作用

Ignore namespace in xpath selector not working

我有下面的 XML 并且想要 select 元素 category.

name 属性的值

我看了here and here and

我其实想要 xpath 1.0,所以我尝试了:
/result/products/product/*:[local-name() = 'categories']/*:[local-name() = 'category']/@name

因为那没有用,我也只是尝试了 xpath 2.0:
/result/products/product/*:categories/*:category/@name

如果我从源文档中删除命名空间前缀,select或/result/products/product/categories/category/@name returns 正确的值。

那么,如何忽略我的 selectors 中的命名空间?

<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>

在您的 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

您的 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

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