我最近遇到了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";
}
让这件事工作,现在我做了它,以便检测到默认命名空间。奇迹般有效!这两个答案都帮助我找到原因,如果可以的话,我会选择两者作为首选答案。
答案 0 :(得分:4)
不熟悉java,但这听起来像是名称空间问题 - 可能是文档的默认命名空间和评估者不同。
编辑:我们可以看到您的xml文档和代码吗? //*[local-name()='body']
如何回应?
答案 1 :(得分:3)