2017-10-16 168 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格式化为自己的需求。