使用javax.xml.validation.Validator对XSD进行XML验证

时间:2013-10-21 16:01:17

标签: java xml validation xsd sax

xsd包含如下声明:

<xsd:attribute name="IDENTIFIER" use="required" type="xsd:ID" />

xml中有问题的行看起来像:

<HEADER IDENTIFIER="invalidId 01">

<HEADER IDENTIFIER="validId01">

xsd:ID类型另见http://books.xmlschemata.org/relaxng/relax-CHP-19.html

定义,冒号,空格或以数字开头是不允许的。 如果生成的文件在eclipse ide中打开并针对daclared xsd进行验证,则会发现错误并正确发出信号。 但是,在JUnit测试期间,将加载相同的xsd并对其生成验证生成的文件。此验证发现任何类型的格式错误的xml,但未找到无效的属性IDENTIFIER。

验证码如下:

static boolean validate(Source source) {
    boolean success = false;
    try {
        Validator validator = mySchema.newValidator();
        success = validate(validator, source);
    } catch (SAXException e) {
        logger.info(MSG_BASE + "SAXException: " + e.getMessage());
    } catch (IOException e) {
        logger.info(MSG_BASE + "IOException: " + e.getMessage());
    }
    return success;
}


private static boolean validate(Validator validator, Source source) 
                                                    throws SAXException, IOException {

    ErrorHandler erH = new DefaultHandler2();
    validator.setErrorHandler(erH);
    validator.validate(source);
    return true;
}

是否有人知道可能缺少什么来告诉验证者考虑对属性的限制?

我没有使用DefaultHandler2,而是将自己的ValidationErrorHandler设置为:

public class ValidationErrorHandler extends DefaultHandler {

,包括:

 @Override
public void error (SAXParseException e) throws SAXException {
throw new SAXParseException(e.getMessage(), buildLocator(e), e);

}

private Locator buildLocator(SAXParseException e) {
    Locator2Impl loc = new Locator2Impl();
    loc.setLineNumber(e.getLineNumber());
    loc.setColumnNumber(e.getColumnNumber());
    loc.setSystemId(e.getSystemId());
    loc.setPublicId(e.getPublicId());
    return loc;
}

警告和FatalError方法相同! 目前我拥有所需的一切!

1 个答案:

答案 0 :(得分:0)

xsd:ID s可能不包含空格,这是正确的。

至于为什么没有从Java验证代码收到错误,请注意DefaultHandler2()忽略所有解析事件。特别是关于error()方法:

  

默认实现不执行任何操作。应用编写者可以   在子类中重写此方法以对每个子类采取特定操作   错误,例如将消息插入日志文件或将其打印到   控制台。

事实上,事实上,org.xml.sax.ErrorHandler的界面已经记录在案:

  

警告:如果应用程序未注册ErrorHandler,则为XML   除了SAXParseExceptions之外,解析错误将不会被报告   被抛出致命的错误。为了检测有效性错误,   必须使用error()调用执行某些操作的ErrorHandler   注册

source codeSAX samples included with Xerces2-J在这方面提供了很好的例子。特别是,Counter class显示了如何扩展DefaultHandler