在XML Validator上设置ErrorHandler会导致验证不正确

时间:2012-09-07 22:02:06

标签: java xml xsd sax xerces

在使用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

1 个答案:

答案 0 :(得分:5)

DefaultHandlererrorwarning无效。但是,它会为fatalError抛出异常。在ValidatorDefaultHandler的文档之间,您会看到,无论好坏,您都会得到您所要求的内容。 :)

编辑: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()) {
    //...
}