2011-03-23 101 views
1

我有一个unmarshaller以及一个MySchema.xsd文件。如何在进行反编组时对XML进行验证?

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。

在此先感谢。 安德鲁

+0

我搜索更多的,我必须使用javax.xml.validation.Validator中google.Seems,这可以从javax.xml创建.validation.Schema来验证它。 (我不确定,但Iwill会在测试结束后返回)ValidationEventHandler是否也可以捕获SaxParseException? – yzandrew 2011-03-23 03:57:50

回答

1

嘛形成涉及XML语法本身,而并非是有效的WRT XML模式:

如果您有没有良好的XML,那么你将得到一个由于JAXB使用的基础分析器无法继续,因此ValidationEvent.FATAL_ERROR和解组将无法继续。

欲了解更多信息:

+0

在你的帖子中,你说“从handleEvent方法返回false将导致JAXB操作停止,返回true将允许它继续(如果可能)”。我试图回报真实的,但仍然抛出saxparseexception。所以我想在解组过程中验证不能正确的XML格式? – yzandrew 2011-03-23 16:52:16

+0

@yzandrew - 我已经更新了我的答案,我错误地指出遇到了错误,但是非格式良好的文档会抛出FATAL_ERROR,并在此时停止解析。 – 2011-03-23 17:08:25

0

K,我搞砸了一些东西,并得到这个问题。 现在我明白了。如果我错了,请指出。下面是我在javadoc中找到的并在我的项目中测试的结果:

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

unmarshaller.unmarshal(xmlInputStream); 

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


我使用javax.xml.validation.Validator来验证xml字符串是否正确并在约束下。

jaxbValidator.validate(xmlSource); 

上述代码将抛出SAXException。 如果未引发异常,则将xml字符串解组到对象中。