我有一个使用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在构建文档时设置该属性,或者至少抑制该警告?我尝试在处理器上设置一堆不同的属性,但没有一个工作。我无论如何都不需要验证,因为文档已经过验证并被读入JAXB对象。
编辑:我一直在尝试覆盖处理器,DocumentBuilder和JAXBSource上的errorListener,但是该消息没有通过它们中的任何一个。答案 0 :(得分:0)
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);
这至少可以抑制那些讨厌的消息。但是,我仍然希望找到更好的解决方案。
答案 1 :(得分:0)
我会更仔细地研究一下这个问题,但首先要说的是JAXBSource扩展了SAXSource,Saxon对待它就像对待任何其他SAXSource一样。 JAXB文档中的警告“因此,一般应用程序强烈建议不要访问在SAXSource上定义的方法”是空的 - 应用程序(如Saxon)在被定义为接受X类对象时,通常不会注意到在他们从未听说过的X子类的规范中给出的建议。
属性“http://xml.org/sax/features/validation”的状态有点不清楚。 IIRC SAX规范没有说每个XMLReader都必须识别这个属性,但它们确实将它定义为请求DTD扩展的唯一方式,并且XSLT处理器需要进行DTD扩展;如果XMLReader没有进行DTD扩展,那么转换可能会以不可预测的方式失败,因此警告是合理的。
抑制警告的最简洁方法可能是提供 识别此属性的XMLReader,并从那里委托给无法识别它的XMLReader。