在Java中使用XPath时直接引用节点的问题

时间:2009-03-16 09:17:38

标签: java xml xpath

我最近遇到了Java的原生XML API(W3C)的问题,其核心是如果我尝试在我的文档中使用直接的XPath表达式,比如//body XPath被评估为false (不正确的行为),但是如果我将其替换为//*[1],则其评估为true (所需行为)

我已经多次检查并使用不同的文档证明我使用的XML是有效的(我主要使用XHTML 2.0和其他系统)。

由于我不知道究竟是什么导致了这一点,这里是我正在使用的各种工厂对象的配置选项集。

正如您所看到的,我有很多与整个问题相关的各种类的自定义实现,我认为可能与该问题有关但我不确定,运行单元测试,使用调试器和一大堆.println:s还没帮助我。

的XPath:

  • xpathfactory.setXPathFunctionResolver(myFunctionResolver)
  • xpath.setNamespaceContext(myNamespaceContext);
  • xpath.setXPathVariableResolver(myResolver);

的DocumentBuilder:

(f == DocumentBuilderFactory)

  • f.f.setValidating(false);
  • f.setSchema(null);
  • f.setNamespaceAware(true);
  • f.setIgnoringComments(true);
  • f.setIgnoringElementContentWhitespace(true);
  • +功能"http://xml.org/sax/features/validation""http://apache.org/xml/features/validation/schema""http://apache.org/xml/features/nonvalidating/load-external-dtd"false

(dc == DocumentBuilder)

  • dc.setEntityResolver(null);
  • dc.setErrorHandler(myErrorHandler);

另外值得一提的是,我在Windows XP上使用Sun Java 5.

此时欢迎所有想法,因为这个问题,我感到非常沮丧。

结论

这是命名空间问题,问题是我根本没有在myNamespaceContext中声明默认命名空间!只需添加

else {
    return "http://www.w3.org/1999/xhtml";
}

让这件事工作,现在我做了它,以便检测到默认命名空间。奇迹般有效!这两个答案都帮助我找到原因,如果可以的话,我会选择两者作为首选答案。

2 个答案:

答案 0 :(得分:4)

不熟悉java,但这听起来像是名称空间问题 - 可能是文档的默认命名空间和评估者不同。

编辑:我们可以看到您的xml文档和代码吗? //*[local-name()='body']如何回应?

答案 1 :(得分:3)

如果它是XHTML,那么它将定义namespace。你要么删除它(不一定是可取的),要么限定你的表达:

//:body

(请注意符合上述条件的前导冒号)enter code here