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

使用javax.XML.validation.Validator对XSD进行XML验证,java,xml,validation,xsd,sax,Java,Xml,Validation,Xsd,Sax,xsd包含如下声明: <xsd:attribute name="IDENTIFIER" use="required" type="xsd:ID" /> 是否有人知道可能缺少什么来告诉验证者考虑对属性的限制? 我没有使用DefaultHandler2,而是将自己的ValidationErrorHandler设置为: public class ValidationErrorHandler extends DefaultHandler { 包括: @Override public v

xsd包含如下声明:

<xsd:attribute name="IDENTIFIER" use="required" type="xsd:ID" />
是否有人知道可能缺少什么来告诉验证者考虑对属性的限制?

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

public class ValidationErrorHandler extends DefaultHandler {
包括:

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

警告和FatalError方法也是如此!
现在我有我所需要的一切

您认为
xsd:ID
s不能包含空格是正确的

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

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

通常情况下,事实上,的接口是这样记录的:

警告:如果应用程序未注册ErrorHandler,则XML 解析错误将不被报告,除非SAXParseExceptions将被报告 由于致命错误而被抛出。为了检测有效性错误,一个 对调用执行某些操作的ErrorHandler必须是 注册的


在这一领域,这方面的经验提供了很好的例子。特别是,显示了如何扩展
DefaultHandler

很高兴知道。事实上,我对任何学科都是新手,我总是从默认设置开始。因此我认为DefaultHandler2()可以完成这项工作。如果不是这样,我将实施必要的措施。@juerg如果有任何后续行动,请告诉我。如果我帮了忙,如果你能告诉我答案,我将不胜感激。谢谢。当然,你的暗示正是我想要的。因此,接下来我将扩展DefaultHandler以包括所需的测试。我还没有开始。看看DefaultHandler,我必须说我不知道哪种方法最好重写。我将从startElement开始,其中提到了属性,以查看我得到了什么。或者,我必须重写error方法,或者两者都重写。文档非常简洁。因此,如果你能告诉我,从哪里开始,或者相关的有价值的信息存在于哪里,你的提示可以加快我的体验。@juerg,我编辑了答案并添加了指向示例源的链接,其中显示了如何扩展
DefaultHandler
。与此同时,我自己也了解了细节。我必须说,这几乎是不需要动脑筋的。事实上,DefaultHandler的实现者可以轻松地完成我所做的事情,而不是什么都不做。事实上,最正常的异常处理就是将异常信息转发给调用方!我在may的问题中添加了一个片段。
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;
}
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;
}