XPath结果为空字符串

Pok*_*uri 6 java xml xpath

以下是我的XML文件

<xyzevent xmlns="http://www.xyz.com/common/xyzevent/v1" xmlns:xsi="http://www.w3.org2001XMLSchema-instance">
<header>
 ----
</header>
<subscription xmlns="http://www.xyz.com/common/xyzevent/source/v1">
  <sender></sender>
  <receiver>
    <clientsubscription>
        <servicemap>nanna</servicemap>
    </clientsubscription>
  </receiver>
</subscription> 
</xyzevent>
Run Code Online (Sandbox Code Playgroud)

当我从这个XML发布org.w3c.dom.Document并使用表达式应用XPathExperssion时

/xyzevent/subscription/receiver/clientsubscription/servicemap/text()
Run Code Online (Sandbox Code Playgroud)

结果空字符串.表达式的问题可能是什么?

谢谢

Bar*_*end 9

那是因为您的XML文档使用了命名空间.XPath真的很烦人的命名空间.要确认这一点,请xmlns=http://.../v1从文档中删除两个并再次运行未命名的无法验证的XML文件的XPath表达式.它会匹配.

发生的事情是你的XPath表达式试图/xyzevent在你的文档包含时选择{http://.../v1}:xyzevent哪个不一样.

有很多方法可以解决这个问题.正确的方法是设置一个,NamespaceContext这样您就可以prefix:localName在XPath表达式中使用表示法,并将前缀解析为正确的URI.在xerces文档中有一个简短的模糊,在StackOverflow的其他地方还有一些 .ibm.com上有广泛的描述.

NamespaceContext将包含两个(或更多)映射:

{
    event => http://www.xyz.com/common/xyzevent/v1
    source => http://www.xyz.com/common/xyzevent/source/v1
}
Run Code Online (Sandbox Code Playgroud)

然后你的XPath表达式就可以了/event:xyzevent/source:subscription/source:receiver/.../text().

作为一个讨厌的解决方法,您可以重写您的xpath表达式以使用该local-name()函数进行选择:

/*[local-name()='xyzevent']/*[local-name()='subscription'/ ...
Run Code Online (Sandbox Code Playgroud)

在这种情况下,表达式匹配任何本地名称为的元素xyzevent,而不管名称空间URI如何.