2011-03-23 97 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字符串解組到對象中。