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 方法相同!目前我拥有我需要的一切!