验证针对XSD的COMPLETE XML

时间:2014-09-10 04:10:57

标签: java xml xml-parsing xsd

我想根据我的XSD COMPLETELY 验证我的XML,这意味着我希望文件从抛出异常的同一点继续验证。

这是我的代码:

public void validate(File file) {
    try {

        Source xmlFile = new StreamSource(file);

        try {

            System.out.println("Processing : " + file.getAbsolutePath());
            System.out.println(validator);
            validator.validate(xmlFile);
            // stringBuffer.append(" is valid");
        } catch (SAXException e) {
            fileWriter.write("\n\n\n" + file.getAbsolutePath());
            System.out.println(xmlFile.getSystemId() + " is NOT valid");
            System.out.println("Reason: " + e.getLocalizedMessage());
            fileWriter.write("\nReason: " + e.getLocalizedMessage());

            if (e instanceof SAXParseException) {
                fileWriter.write(" (Line : "
                        + ((SAXParseException) e).getLineNumber()
                        + ", Col : "
                        + ((SAXParseException) e).getColumnNumber() + ")");
            }

            fileWriter.flush();
            validate(file);
        }
    } catch (Exception exception) {
        exception.printStackTrace(System.out);
    }
}

根据这个片段,在JUST ONE EXCEPTION之后,代码返回错误并停止验证更多的XML ..但有没有办法在XSD上获取XML的所有错误?简而言之,从光标继续验证它抛出异常的位置。 任何方式?

谢谢!

1 个答案:

答案 0 :(得分:2)

默认错误处理程序的行为是在抛出SAXException遇到第一个致命错误后停止处理。要更改此行为,请实施您自己的ErrorHandler并将其注册到验证程序。

这是一个将异常转储到标准输出的示例,但您可能希望将其替换为更智能的报告机制。

class CustomErrorHandler implements ErrorHandler {
    public void fatalError(SAXParseException e) throws SAXException {
        System.out.println(e.toString());
    }

    public void error( SAXParseException e ) throws SAXException {
        System.out.println(e.toString());
    }

    public void warning( SAXParseException e ) throws SAXException {
        System.out.println(e.toString());
    }
}

然后:

validator.setErrorHandler(new CustomErrorHandler());