XPath一个名称空间不同的模式

时间:2012-12-12 22:03:06

标签: xml xpath namespaces

当我想在一个命名空间有不同的模式时从xml文件中选择带有xpath的项目时,我遇到了问题。

鉴于这是有效的xml文件:

<getDataAction xmlns="http://example.org/ns1">
   <getData xmlns:f4k1="http://example.org/ns2" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
      <f4k1:place xmlns:f5k1="http://example.org/ns3">
         <f4k1:city i:type="f5k1:Country" xmlns:f5k1="http://example.org/ns4">
           <f5k1:notice>Notice</f5k1:notice>
         </f4k1:city>
         <f4k1:testvillage i:nil="true">
           <f4k1:data xmlns:f5k1="http://example.org/ns5">
             <f5k1:address xmlns:d7k1="http://example.org/ns6">
               <f5k1:important>no</f5k1:important>
             </f5k1:address>
           </f4k1:data>
         </f4k1:testvillage>
      </f4k1:place>
  </getData>
</getDataAction>

我想选择

<f5k1:notice>Notice</f5k1:notice>

所以我使用这个xpath-query //f5k1:notice,但它不起作用。如果我将ns5名称空间(第8行)更改为ns4(如第4行所示),它将起作用。

你能告诉我为什么这样做有效以及我必须做些什么才能让它在不改变XML的情况下工作?

1 个答案:

答案 0 :(得分:1)

XPath表达式//f5k1:notice求值为一组元素,其本地名称为notice,其名称空间名称是环境绑定到f5k1的任何名称空间。由于您没有指定用于评估此XPath表达式的环境,因此无法准确说出出现了什么问题,但最简单的解释是,在您的环境中,f5k1未绑定到{{1 }}

最佳解决方法:了解如何将前缀绑定到您正在使用的系统中的命名空间。

最简单的解决方法:http://example.org/ns4