【问题标题】:JAXB / MOXy: How to set which xpath impl to use?JAXB / MOXy:如何设置要使用的 xpath impl?
【发布时间】:2013-06-11 15:38:53
【问题描述】:

我使用 MOXy 的@XmlPath("/foo/bar[@baz]")

在应用程序的其他地方我需要 XSLT 2.0,所以我在我的类路径中包含了 Saxon HA 9.5。 但这会导致 XPath 失败(找不到节点,这与 JDK 的实现不同)。

如何为 MOXy 设置要使用的 XML / XPath impl?

目前我在 JAXB bean 的 .class 旁边使用 jaxb.properties,但我可以使用一些工厂选项等创建编组器。

额外问题:我认为 XPath 的问题在于 XML 文件使用命名空间,<deployment xmlns="urn:jboss:bean-deployer:2.0"> ...
如何让 Saxon 忽略 XPath 中的名称空间? (无需重写 XPath 表达式)。

【问题讨论】:

  • 您好,感谢您提出这个问题。实际上,我也在尝试做类似的事情,但由于某种原因,它没有按预期工作。我也尝试了这个答案中提到的东西。我尝试了这种方法和作者博客中的示例,但 JAXB Marshalling 仍然无法按预期使用 @XmlPath。似乎使用和不使用 @XmlPath 生成的 XML 是相同的。请您查看此示例并提供您的答案:stackoverflow.com/questions/67500565/…

标签: java xpath jaxb implementation moxy


【解决方案1】:

EclipseLink JAXB (MOXy)@XmlPath 注释支持 XPath 规范的子集。 XPath 处理由 MOXy 自己完成。支持以下概念:

  • 属性 - @id
  • 元素 - address
  • 按位置的元素 - address[1]
  • 谓词元素 - address[@type='mailing']
  • 元素文本 - name/text()
  • 文本 - text()
  • 自我-.
  • 组合-personal-info/name[2]/text()

对于命名空间限定节点,@XmlNs 注释中定义的前缀可用于限定 XPath 片段。不合格的片段将被假定在使用 @XmlSchema 指定的命名空间中。

【讨论】:

  • 谢谢,实际上 XPath 异常来自不同的地方。
【解决方案2】:

郑重声明,这与 MOXy 无关。这是我使用 XPath 的代码。所以我最终得到了

//XPathFactory xpf = XPath xp = XPathFactory.newInstance();
//XPathFactory xpf = new net.sf.saxon.xpath.XPathFactoryImpl();
XPathFactory xpf = new com.sun.org.apache.xpath.internal.jaxp.XPathFactoryImpl();

这会抱怨

com.sun.org.apache.xpath.internal.jaxp.XPathFactoryImpl is internal proprietary API and may be removed in a future release

但有效。

关于命名空间,这里是discussion on ignoring namespaces

【讨论】:

  • 您可以通过将-XDignore.symbol.file 命令行选项传递给javac 来消除“内部专有API”警告。 (不过,不建议这样做。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多