Validation 在进行解组时,如何使用格式不好的XML进行验证?

Validation 在进行解组时,如何使用格式不好的XML进行验证?,validation,jaxb,saxparser,well-formed,Validation,Jaxb,Saxparser,Well Formed,我有一个解组器和一个MySchema.xsd文件 StreamSource sources = new StreamSource(getClass().getClassLoader().getResourceAsStream("/xmlValidation.xsd")); SchemaFactory sf = SchemaFactory.newInstance( XMLConstants.W3C_XML_SCHEMA_NS_URI ); unmarshaller.setS

我有一个解组器和一个MySchema.xsd文件

    StreamSource sources = new StreamSource(getClass().getClassLoader().getResourceAsStream("/xmlValidation.xsd"));
    SchemaFactory sf = SchemaFactory.newInstance( XMLConstants.W3C_XML_SCHEMA_NS_URI );
    unmarshaller.setSchema(sf.newSchema(sources));
并调用unmarshaller.setEventHandler()函数,通过以下方式指定自定义验证事件处理程序(基本上格式化错误提示字符串):

    final String errorString = new String();
    unmarshaller.setEventHandler(new ValidationEventHandler() {
        @Override
        public boolean handleEvent(ValidationEvent validationevent) {
            if(validationevent.getSeverity()!= ValidationEvent.WARNING){
                errorString.format( "Line:Col[" + validationevent.getLocator().getLineNumber()
                                    + ":" + validationevent.getLocator().getColumnNumber()
                                    + "]:" + validationevent.getMessage());
                return false;
            }
            return true;
        }
    });
上面的代码似乎工作正常(当输入字符串被验证时,我可以得到java对象,并且错误提示字符串被格式化为例外)

问题是,当输入xml的格式不好时,它还会抛出SaxParseException

提前谢谢。
安德鲁

K,我把事情搞砸了,然后遇到了这个问题。 现在我明白了。如果我错了,请指出我。下面是我在javadoc中找到的内容,并对我的项目进行了测试:

当解组器正在解组时,javax.xml.bind.ValidationEventHandler可以使用给定的模式约束处理约束错误

unmarshaller.unmarshal(xmlInputStream);
如果发生错误,则在解组过程中将调用ValidationEventHandler。 如果xmlInputStream格式不正确,将抛出SAXEception。 我也找不到捕获sax解析器抛出的SAXException的方法,所以我猜在解组期间使用验证不能与格式不正确的xml字符串一起使用


我使用javax.xml.validation.Validator来验证xml字符串的格式是否良好,是否受约束

jaxbValidator.validate(xmlSource);
上述代码将引发SAXException。
如果没有抛出异常,则将xml字符串解组到对象中。

K,我搞糟了一些事情,并遇到了这个问题。 现在我明白了。如果我错了,请指出我。下面是我在javadoc中找到的内容,并对我的项目进行了测试:

当解组器正在解组时,javax.xml.bind.ValidationEventHandler可以使用给定的模式约束处理约束错误

unmarshaller.unmarshal(xmlInputStream);
如果发生错误,则在解组过程中将调用ValidationEventHandler。 如果xmlInputStream格式不正确,将抛出SAXEception。 我也找不到捕获sax解析器抛出的SAXException的方法,所以我猜在解组期间使用验证不能与格式不正确的xml字符串一起使用


我使用javax.xml.validation.Validator来验证xml字符串的格式是否良好,是否受约束

jaxbValidator.validate(xmlSource);
上述代码将引发SAXException。
如果没有引发异常,则将xml字符串解组到对象中。

格式良好与xml语法本身有关,而不是有效地写入xml架构:

如果XML格式不正确,则会出现ValidationEvent.FATAL_错误,解组将无法继续,因为JAXB使用的底层解析器无法继续

有关更多信息:


格式良好与XML语法本身有关,而不是在XML模式中有效:

如果XML格式不正确,则会出现ValidationEvent.FATAL_错误,解组将无法继续,因为JAXB使用的底层解析器无法继续

有关更多信息:


我在谷歌上搜索了更多信息。似乎我必须使用javax.xml.validation.Validator来验证它,它可以从javax.xml.validation.Schema创建。(我不确定。但我会在测试后回来)ValidationEventHandler是否也可以捕获SaxParseException?我在google上搜索了更多。似乎我必须使用javax.xml.validation.Validator来验证它,它可以从javax.xml.validation.Schema创建。(我不确定。但我会在测试后回来)ValidationEventHandler是否也可以捕获SaxParseException?在您的帖子中,您说“从handleEvent方法返回false将导致JAXB操作停止,返回true将允许它继续(如果可能)”。我试图返回true,但仍然抛出saxparseexception。因此,我猜在解组过程中的验证无法使用格式不好的xml?@yzandrew-我已经更新了我的答案,我错误地说遇到了错误,但格式不好的文档抛出了致命错误,解析在这一点上停止。在你的帖子中,你说从handleEvent方法返回false将导致JAXB操作停止,返回true将允许它继续(如果可能的话)“。我尝试返回true,但仍然抛出saxparseexception。因此,我猜在解组过程中的验证不能用格式不好的xml完成?@yzandrew-我已经更新了我的答案,我错误地说遇到了错误,但格式不好的文档抛出了致命的错误,解析在此点停止。