将 Saxon 的 DocumentBuilder 与 JAXB 一起使用会发出有关验证的警告
Using Saxon's DocumentBuilder with JAXB emits a warning about validation
我有一个应用程序将 JAXB (Moxy) 和 Saxon 用于 运行 XPath 表达式。一切都按预期工作,但 Saxon 的 DocumentBuilder 发出此警告:
XML Parser does not recognize the feature http://xml.org/sax/features/validation
代码:
Processor proc = new Processor(false);
DocumentBuilder builder = proc.newDocumentBuilder();
XdmNode doc = builder.build(new JAXBSource(jaxbContext, jaxbObject));//The warning occurs here
...
我认为发生的事情是 JAXB 使用 StaX 解析器而 Saxon 使用 SAX。因此,当 Saxon 尝试在 StaX 解析器上设置上述 属性 时,它会失败。
有没有办法阻止 Saxon 在构建文档时设置 属性 或至少抑制该警告?我试过在处理器上设置一堆不同的属性,但其中 none 有效。无论如何我都不需要验证,因为文档已经过验证并读入 JAXB 对象。
编辑:我一直在尝试覆盖处理器、DocumentBuilder 和 JAXBSource 上的 errorListener,但该消息没有通过它们中的任何一个。
private class SaxonLogger extends StandardLogger {
@Override
public void warning(String message) {
if(!message.contains("http://xml.org/sax/features/validation")) {
System.err.println(message);
}
}
}
...
proc.getUnderlyingConfiguration().setLogger(logger);
这至少会抑制那些讨厌的消息。不过,我还是想找到更好的解决办法。
我会更仔细地研究一下,但首先要说的是 JAXBSource 扩展了 SAXSource,Saxon 对待它的方式与对待任何其他 SAXSource 的方式完全一样。 JAXB 文档 "Thus in general applications are strongly discouraged from accessing methods defined on SAXSource" 中的警告是空洞的 - 当应用程序(如 Saxon)被定义为接受 class X 的对象时,通常不会注意到规范中给出的任何建议他们从未听说过的 X 的子class。
属性“http://xml.org/sax/features/validation”的状态有点不清楚。 IIRC SAX 规范并没有说每个 XMLReader 都必须识别这个 属性,但他们确实将其定义为请求 DTD 扩展的唯一方式,并且 XSLT 处理器需要进行 DTD 扩展;如果 XMLReader 不进行 DTD 扩展,则转换可能会以不可预测的方式失败,因此警告是合理的。
抑制警告的最干净的方法可能是提供一个 识别此 属性 的 XMLReader,然后从那里委托给一个不识别的 XMLReader它。
我有一个应用程序将 JAXB (Moxy) 和 Saxon 用于 运行 XPath 表达式。一切都按预期工作,但 Saxon 的 DocumentBuilder 发出此警告:
XML Parser does not recognize the feature http://xml.org/sax/features/validation
代码:
Processor proc = new Processor(false);
DocumentBuilder builder = proc.newDocumentBuilder();
XdmNode doc = builder.build(new JAXBSource(jaxbContext, jaxbObject));//The warning occurs here
...
我认为发生的事情是 JAXB 使用 StaX 解析器而 Saxon 使用 SAX。因此,当 Saxon 尝试在 StaX 解析器上设置上述 属性 时,它会失败。
有没有办法阻止 Saxon 在构建文档时设置 属性 或至少抑制该警告?我试过在处理器上设置一堆不同的属性,但其中 none 有效。无论如何我都不需要验证,因为文档已经过验证并读入 JAXB 对象。
编辑:我一直在尝试覆盖处理器、DocumentBuilder 和 JAXBSource 上的 errorListener,但该消息没有通过它们中的任何一个。
private class SaxonLogger extends StandardLogger {
@Override
public void warning(String message) {
if(!message.contains("http://xml.org/sax/features/validation")) {
System.err.println(message);
}
}
}
...
proc.getUnderlyingConfiguration().setLogger(logger);
这至少会抑制那些讨厌的消息。不过,我还是想找到更好的解决办法。
我会更仔细地研究一下,但首先要说的是 JAXBSource 扩展了 SAXSource,Saxon 对待它的方式与对待任何其他 SAXSource 的方式完全一样。 JAXB 文档 "Thus in general applications are strongly discouraged from accessing methods defined on SAXSource" 中的警告是空洞的 - 当应用程序(如 Saxon)被定义为接受 class X 的对象时,通常不会注意到规范中给出的任何建议他们从未听说过的 X 的子class。
属性“http://xml.org/sax/features/validation”的状态有点不清楚。 IIRC SAX 规范并没有说每个 XMLReader 都必须识别这个 属性,但他们确实将其定义为请求 DTD 扩展的唯一方式,并且 XSLT 处理器需要进行 DTD 扩展;如果 XMLReader 不进行 DTD 扩展,则转换可能会以不可预测的方式失败,因此警告是合理的。
抑制警告的最干净的方法可能是提供一个 识别此 属性 的 XMLReader,然后从那里委托给一个不识别的 XMLReader它。