忽略 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>Curtains>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]
我有下面的 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>Curtains>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]