在我对xsd验证xml之后如何列出所有错误?

时间:2017-10-16 03:51:29

标签: java xml list xsd

我在网上搜索了几天,但我仍然无法列出所有错误,我只能显示1个错误。为什么?我需要列出所有的错误。希望有人帮助我。下面是我的验证和错误处理程序代码。程序只转到error(),只转一次。第一个元素的错误,但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());
        }  

    }

}

以下是我的错误处理程序

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());
    }

}

1 个答案:

答案 0 :(得分:2)

首先,这取决于您使用的架构验证程序。 JAXP接口旨在与各种模式验证器配合使用。如果您使用的是JDK附带的默认版本,请告知我们。

所有验证器都能够从某些错误而不是其他错误中恢复,因此我们需要知道的另一件事是特定错误是什么。发布样本XSD和XML以便我们比较结果会很有用。

如果您想考虑使用Saxon作为模式验证引擎,它可以选择在XML报告中列出所有验证错误,您可以使用XSLT格式化为您自己的要求。