gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 02:52:39 25 4
gpt4 key购买 nike

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

我已经多次检查不同的文档,我使用的 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);
  • +features "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 中声明 default 命名空间!只需添加

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

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

最佳答案

不熟悉 java,但这听起来像是命名空间问题 - 大概是文档和求值器的默认命名空间不同。

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

关于java - 在 Java 中使用 XPath 时直接引用节点的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/649723/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com