XPath结果为空字符串 - java

以下是我的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>

当我从该XML中获取org.w3c.dom.Document并在表达式中应用XPathExperssion时

/xyzevent/subscription/receiver/clientsubscription/servicemap/text()

结果为空字符串。表达式有什么问题?

谢谢

参考方案

那是因为您的XML文档使用名称空间。 XPath确实使名称空间烦人。要确认这一点,请从文档中删除两个xmlns=http://.../v1,然后再次运行XPath表达式,再运行未命名的,不可验证的XML文件。会匹配的。

发生的是,当您的文档包含/xyzevent时,您的XPath表达式尝试选择{http://.../v1}:xyzevent,这不是同一回事。

有多种方法可以解决此问题。正确的方法是设置NamespaceContext,以便可以在XPath表达式中使用prefix:localName表示法,并将前缀解析为正确的URI。在xerces docs和更多的elsewhere on StackOverflow中对此有一个简短的描述。 ibm.com有大量描述。

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

{
    event => http://www.xyz.com/common/xyzevent/v1
    source => http://www.xyz.com/common/xyzevent/source/v1
}

然后,您的XPath表达式可以变成/event:xyzevent/source:subscription/source:receiver/.../text()

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

/*[local-name()='xyzevent']/*[local-name()='subscription'/ ...

在这种情况下,表达式将匹配任何本地名称为xyzevent的元素,而与名称空间URI无关。

Java中的<<或>>>是什么意思? - java

This question already has answers here: Closed 7 years ago. Possible Duplicate: What does >> and >>> mean in Java?我在一些Java代码中遇到了一些陌生的符号,尽管代码可以正确编译和运行,但对于括号在此代码中的作用却感…

与哪些运算符>>兼容 - java

我这里没有什么代码int b=3; b=b >> 1; System.out.println(b); 它可以完美工作,但是当我将变量b更改为byte,short,float,double时,它包含错误,但是对于变量int和long来说,它可以完美工作,为什么它不能与其他变量一起工作? 参考方案 位移位运算符(例如>>)与任何整数类型兼…

菱形运算符<>是否等于<?> - java

我在util.TreeSet类中发现,其中一个构造函数正在使用具有空泛型类型的新TreeMap调用另一个构造函数。 public TreeSet(Comparator<? super E> comparator) { this(new TreeMap<>(comparator)); } new TreeMap<>是什么意思…

通过Maven编译器插件不会发生有限的包含和排除 - java

我正在使用3.6.0版的maven编译器插件,在此我们只想在特定文件夹中编译一个文件,而在该位置编译所有其他文件。例如:在文件夹应用程序中有14个文件,从那我只希望编译1个文件,但它编译了所有文件,如果我要排除,则它也不起作用。 <sourceDirectory>${basedir}/../src/java</sourceDirectory…

Java中的“ <<”运算符 - java

最喜欢的语句来自Java的Character类:(1 << Character.PARAGRAPH_SEPARATOR)) >> type PARAGRAPH_SEPARATOR是字节,type是整数。这句话中的操作员,他们做什么?如何以及在哪里可以使用这些运算符?这是oracles java.lang.Character文档。该类中…