我最近碰到了一个问题,Java的原生XML API(W3C),它的核心是,如果我试图在文档中直接使用XPath表达式,比如说
//body
xpath的计算结果为false
(错误行为)
但是如果我把它换成
//*[1]
它的评价是真的
(理想行为)
.
我已经检查了很多次,并且使用了不同的文档,我使用的XML是有效的。(
我主要在这个系统的其余部分使用XHTML 2.0
)
由于我不知道是什么导致了这一点,下面是我正在使用的各种工厂对象的配置选项集。
如您所见,我有很多与整个问题相关的各种类的自定义实现,我认为这可能与问题有关,但我不确定,运行单元测试、使用调试器和大量的.println:s还没有帮助我。
XPath:
-
xpathfactory.setXPathFunctionResolver(myFunctionResolver)
-
xpath.setNamespaceContext(myNamespaceContext);
-
xpath.setXPathVariableResolver(myResolver);
文档生成器:
(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);
另外值得一提的是,我在WindowsXP上使用Sun Java 5。
在这一点上,所有的想法都是受欢迎的,因为这个问题,我感到非常沮丧。
结论
这是一个名称空间问题,问题是我没有声明
违约
MyNamespaceContext中的命名空间!只是添加
else {
return "http://www.w3.org/1999/xhtml";
}
使其正常工作,现在我使其正常工作,以便检测到默认名称空间。真是魅力四射!这两个答案都帮助我找到了原因,如果可能的话,我会选择这两个答案作为首选答案。