【问题标题】:Most pain-free way to add XPath 3.0 to a codebase using dom4j使用 dom4j 将 XPath 3.0 添加到代码库的最轻松方式
【发布时间】:2016-05-21 00:05:30
【问题描述】:

据我了解,SAXON 是唯一在 Java 中支持 XPath 3.0 的库。 它的 JAXP 实现只支持 XPath 2.0。 它的 XPath 3.0 实现应该被称为 this way 并且要求我首先使用它自己的 API 构建文档,而不是使用像 DOM4J 这样的兼容 JAXP 的 API。

这很痛苦,因为我一直小心地将使用 XPath 的所有内容抽象为以 JAXP 节点和 xpath 字符串作为参数的代理接口,但如果我必须重构所有内容以使用 SAXON 节点,这似乎毫无意义自上而下。

我是不是误会了什么?有没有更不痛的方法?

【问题讨论】:

  • Java 中有各种 XQuery 3.0 实现,而 XPath 3.0 是 XQuery 3.0 的子集。至于 JAXP,我不知道 BaseX 或 eXist 是否公开了该 API。至于 Saxon,为什么您认为 Saxon 和 JAXP 可以实现 XPath 2.0,而 XPath 3.0 不行?我认为这两个版本都可能导致 JAXP 无法处理的结果,但总的来说,我没有看到对 XPath 2.0 的限制。 JAXP 非常适合 XPath 1.0,这使得使用想要返回节点集或单个原语 val 的 API 难以获得丰富类型系统和节点的原子值序列
  • 我已经尝试了 Saxon 9.7 HE 和 JAXP XPath 以及一些使用 XPath 3.0 和 3.1 功能(如 !letjson-to-xml)的示例表达式,它们工作正常。 HE 不支持高阶函数或内联函数等某些功能,但在 EE 中可以使用。

标签: xpath saxon jaxp


【解决方案1】:

我越来越多地尝试鼓励用户使用 s9api API 而不是 JAXP 进行 XPath 处理。原因是多方面的:JAXP 接口只对 DOM 以外的树模型提供了非常半心半意的支持;它确实与 XPath 2.0 和现在的 3.0 的扩展类型系统作斗争,而在 Saxon 的情况下,它与其他 XML 技术和 API 的互操作性完全不理想。

但是,Saxon 继续支持 JAXP XPath API,但有其所有限制,无论是针对其自己的树模型还是针对 DOM4J 等第三方树模型。

我们放弃的一件事是对 XPath 服务接口的支持,如果使用 XPathFactory.newInstance() 方法的应用程序在类路径上,它将选择 Saxon。这样做的原因是,当您编写应用程序时,您确实需要知道您需要 XPath 1.0 还是 2.0 处理器,而 JAXP 机制让您无法说出您想要哪个,或者发现您已经获得了哪个。结果是,当使用不正确的类路径部署时,许多应用程序都遇到了难以诊断的故障。如果您希望 Saxon 作为您的 JAXP XPath 提供者,您现在必须明确提出要求。

如果您能更具体地说明您正在尝试做什么以及它是如何失败的,那将会很有用。

【讨论】:

    猜你喜欢
    • 2023-04-06
    • 1970-01-01
    • 2011-01-12
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    • 2010-11-03
    • 2017-12-12
    • 1970-01-01
    相关资源
    最近更新 更多