1

我有一个解组器和一个 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。

提前致谢。安德鲁

4

2 回答 2

1

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

如果您的 XML 格式不正确,那么您将收到 ValidationEvent.FATAL_ERROR 并且解组将无法继续,因为 JAXB 使用的底层解析器无法继续。

了解更多信息:

于 2011-03-23T13:11:12.813 回答
0

K,我搞砸了一些事情并得到了这个问题。现在我想通了。如果我错了,请指出我。下面是我在 javadoc 中找到并在我的项目中测试的内容:

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

unmarshaller.unmarshal(xmlInputStream);

如果发生错误,将在解组过程中调用 ValidationEventHandler。如果 xmlInputStream 格式不正确,将抛出 SAXEception。而且我无法找到一种方法来捕获由 sax 解析器抛出的 SAXException,所以我猜想在解组期间使用验证不能归因于格式不正确的 xml 字符串。


我使用 javax.xml.validation.Validator 来验证 xml 字符串的格式是否正确且受到约束。

jaxbValidator.validate(xmlSource);

上面的代码将抛出 SAXException。如果没有抛出异常,则将 xml 字符串解组为对象。

于 2011-03-23T05:16:33.177 回答