2014-02-18 77 views
2

我的問題是:如果驗證與JAXB

檢查XML文檔的結構良好的對於它的架構。

特別是,我希望能夠使用「驗證程序」返回NULL在任何錯誤的情況下(問題minOccurs/maxOccurs,缺乏標籤等)。

如何擴展/修復我的代碼以實現我的請求?

UDInfo temp = new UDInfo(); 

    try { 
      File fileXML = new File(pathXML); 
      SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
      Schema schema = sf.newSchema(new File(pathXSD)); 
      JAXBContext jaxbContext = JAXBContext.newInstance(UDInfo.class); 

      Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); 
      jaxbUnmarshaller.setSchema(schema); 
      jaxbUnmarshaller.setEventHandler(new MyValidationEventHandler()); 

      // if (validation is Ok) temp = (UDInfo) jaxbUnmarshaller.unmarshal(fileXML); 
      // else temp = null; 

    } catch (SAXException e) { 
      e.printStackTrace(); 
    } catch (JAXBException ex) { 
      Logger.getLogger(unMarsh.class.getName()).log(Level.SEVERE, null, ex); 
    } 

MyValidationEventHandler是:

public class MyValidationEventHandler implements ValidationEventHandler { 

public boolean handleEvent(ValidationEvent event) { 
    System.out.println("\nEVENT"); 
    System.out.println("SEVERITY: " + event.getSeverity()); 
    System.out.println("MESSAGE: " + event.getMessage()); 
    System.out.println("LINKED EXCEPTION: " + event.getLinkedException()); 
    return true; 
} } 
+1

商店的事件?驗證發生在調用'unmarshal'的時候。您將不得不將結果存儲在臨時變量中,然後檢查驗證處理程序的內容以查看是否找到錯誤。 –

+0

我知道,但我希望我可以避免使用全局變量並以更「乾淨」的方式管理所有內容(例外,參數傳遞等)。 – Zany

+2

您不需要全局變量。狀態可以在'MyValidationEventHandler'的實例中保存,並在解組操作之後進行檢查。 –

回答

3

你可以做類似如下:

 Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); 
     jaxbUnmarshaller.setSchema(schema); 
     MyValidationEventHandler myValidationEventHandler(); 
     jaxbUnmarshaller.setEventHandler(myValidationEventHandler); 
     jaxbUnmarshaller.unmarshal(xml); 
     myValidationEventHandler.getMyState();