在使用Java的XML Validator
(我认为使用Apache Xerces实现)时,我遇到了一些非常奇怪的行为。
我正在尝试针对XSD验证一些XML文档,并且我想记录导致文档无效的任何内容。我认为实现我自己的ErrorHandler
将允许我这样做。我很快发现这导致XML文档被错误地验证(即无效的XML被识别为对我的XSD有效)。
我做了一些测试,发现只需将Validator
的{{1}}设置为任何内容就会导致此行为,如下所示。
ErrorHandler
我认为validator.validate(invalidXmlSource); // XML correctly identified as INVALID
validator.setErrorHandler(new DefaultHandler());
validator.validate(invalidXmlSource); // XML incorrectly identified as VALID
在没有指定时使用Validator
,所以我不明白为什么行为会发生变化。
这里发生了什么?
修改
DefaultHandler
答案 0 :(得分:5)
DefaultHandler
对error
和warning
无效。但是,它会为fatalError
抛出异常。在Validator
和DefaultHandler
的文档之间,您会看到,无论好坏,您都会得到您所要求的内容。 :)
编辑:Validator
文档中可能需要注意的主要事项是默认(null)错误处理程序将为error
抛出异常......
Edit2:这里有一个可能的错误处理程序的概述,可以执行您想要的操作:
import org.xml.sax.ErrorHandler;
import org.xml.sax.SAXParseException;
public class LoggingErrorHandler implements ErrorHandler {
private boolean isValid = true;
public boolean isValid() {
return this.isValid;
}
@Override
public void warning(SAXParseException exc) {
// log info
// valid or not?
}
@Override
public void error(SAXParseException exc) {
// log info
this.isValid = false;
}
@Override
public void fatalError(SAXParseException exc) throws SAXParseException {
// log info
this.isValid = false;
throw exc;
}
}
它可以这样使用:
LoggingErrorHandler errorHandler = new LoggingErrorHandler();
validator.setErrorHandler(errorHandler);
validator.validate(invalidXmlSource);
if (!errorHandler.isValid()) {
//...
}