2017-10-16 166 views
2

我已經在網上搜索並嘗試了幾天,但我仍然無法列出所有的錯誤,我只能顯示1錯誤。爲什麼?我需要列出所有的錯誤。希望有人幫助我。以下是我的驗證和錯誤處理程序代碼。程序只進入error(),並且只進行一次。它錯誤的第一個元素,但也有其他元素丟失在XML中,它不顯示它們。如何在xsd驗證xml後列出所有錯誤?

import java.io.File; 
import java.io.IOException; 

import javax.xml.XMLConstants; 
import javax.xml.transform.Source; 
import javax.xml.transform.stream.StreamSource; 
import javax.xml.validation.Schema; 
import javax.xml.validation.SchemaFactory; 
import javax.xml.validation.Validator; 

import org.xml.sax.SAXException; 

public class XMLValidate1 { 

    public static void main(String[] args) throws SAXException, IOException { 


     SchemaFactory factory 
     = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
     File schemaLocation = new File("Q1.xsd"); 
     Schema schema = factory.newSchema(schemaLocation); 
     Validator validator = schema.newValidator(); 
     validator.setErrorHandler(new ValidateErrorHandler());  
     Source xmlFile = new StreamSource(new File("Q1.xml")); 

     try { 
      validator.validate(xmlFile); 
      System.out.println(xmlFile.getSystemId() + " is valid."); 
     } 
     catch (SAXException ex) { 
      System.out.println(xmlFile.getSystemId() + " is not valid because "); 
      System.out.println(ex.getMessage()); 
     } 

    } 

} 

下面是我的ErrorHandler

import org.xml.sax.ErrorHandler; 
import org.xml.sax.SAXException; 
import org.xml.sax.SAXParseException; 

public class ValidateErrorHandler implements ErrorHandler { 

    public void warning(SAXParseException ex) { 
     System.out.println("Warning: "); 
     System.err.println(ex.getMessage()); 
    } 

    public void error(SAXParseException ex) { 
     System.out.println("Error: "); 
     System.err.println(ex.getMessage()); 
    } 

    public void fatalError(SAXParseException ex) throws SAXException { 
     System.out.println("Fatal error: "); 
     System.err.println(ex.getMessage()); 
    } 

}

+0

我根本沒有看到任何列表。 – shmosel

回答

2

首先,這取決於你所使用的架構驗證。 JAXP接口被設計爲與各種模式驗證器一起工作。如果您使用的是JDK附帶的默認版本,則應該通知我們。

所有驗證器都能夠從一些錯誤中恢復而不是其他的,所以我們需要知道的另一件事是特定的錯誤是什麼。發佈標本XSD和XML是非常有用的,因此我們可以比較結果。

如果您想考慮使用Saxon作爲您的模式驗證引擎,那麼您可以選擇向您提供XML報告中所有驗證錯誤的列表,您可以使用XSLT格式化爲自己的需求。