2013-08-05 33 views
0

我正在尋找一種方法來根據內部模式驗證我的XML文件。目前這是我的代碼。使用內部架構驗證XML返回一個布爾值

final SAXParserFactory factory = SAXParserFactory.newInstance(); 
factory.setValidating(true); 
factory.setNamespaceAware(true); 

SAXParser parser; 
parser = factory.newSAXParser(); 
parser.setProperty("http://java.sun.com/xml/jaxp/properties/schemaLanguage", 
    "http://www.w3.org/2001/XMLSchema"); 

final XMLReader reader = parser.getXMLReader(); 
reader.setErrorHandler(new SAXErrorHandler()); 
reader.parse(new InputSource(doc)); 

那麼它的作用是報告驗證錯誤,如果它是非致命錯誤和解析可以繼續警告。這很好,因爲我可以看到更多的錯誤,如果它只是打破並引發異常。

但是它不確實正在代碼中的可用信息給我,讓我可以有一個方法boolean validate()返回是否存在或不存在錯誤(警告)

所以我想到了一個自己的實例ErrorHandler的屬性,我可以搶在解析完成後,但這聽起來對我來說並不酷:)

接下來的事情是解析這樣的解析需要一些時間,只需使用驗證器可以顯着更快(和是這是時間關鍵;)),但因爲我需要內部模式進行驗證,所以我不知道如何完全解析。

回答

1

是的,你想使用一個自定義ErrorHandler來跟蹤是否遇到錯誤(不知道你認爲聽起來「不酷」)。

至於「驗證」與「解析」,你如何期待驗證一個文件而不解析它?

+0

我經過這裏的SO各種問題,所有建議哪些需要外接方案Validator類閱讀。也許我錯了,但我認爲Validator並不像解析器那樣構建完整的DOM樹,因此速度更快。 我希望能找到比自定義的ErrorHandler更流暢的東西,但我會試一試;)。感謝您的回答。 –

+0

@DennisIch - SAX解析器根本不構建DOM樹。它所做的只是將事件傳遞給處理程序。 – jtahlborn

+0

很高興知道,謝謝你在這裏的幫助。 –

0
public static boolean validate(String xml) 
    throws ParserConfigurationException, IOException { 
    try { 
     SAXParserFactory factory = SAXParserFactory.newInstance(); 
     factory.setValidating(true); 
     factory.setNamespaceAware(true); 

     SAXParser parser = factory.newSAXParser(); 

     XMLReader reader = parser.getXMLReader(); 
     // custom error handler 
     // ignore warning, throw on error and fatal 
     // (we will catch later to return false!) 
     reader.setErrorHandler(
      new ErrorHandler() { 
      public void warning(SAXParseException e) throws SAXException { 
       System.out.println("WARNING : " + e.getMessage()); // do nothing 
      } 

      public void error(SAXParseException e) throws SAXException { 
       System.out.println("ERROR : " + e.getMessage()); 
       throw e; 
      } 

      public void fatalError(SAXParseException e) throws SAXException { 
       System.out.println("FATAL : " + e.getMessage()); 
       throw e; 
      } 
      } 
     ); 
     reader.parse(new InputSource(xml)); 
     return true; 
    } 
    catch (ParserConfigurationException pce) { 
     throw pce; 
    } 
    catch (IOException io) { 
     throw io; 
    } 
    catch (SAXException se){ 
     return false; 
    } 
    } 

SAX ErrorHandler

+0

那麼SAXErrorHandler確實如此,但這也不會捕獲警告,如果我拋出警告解析停止,但我希望所有警告被記錄;)。 –

+0

嗯...這取決於你自定義警告處理。添加到SAX ErrorHandler Javadoc的鏈接。 – RealHowTo