2012-06-21 29 views
26

我有一个像下面这样的标准代码来验证xml对xsd,但是它会在第一个错误时抛出异常并停止。如何验证xml,但继续处理第一个和下一个错误,并最终得到它们?它甚至有可能吗?如何根据xsd验证xml并获取* ALL *错误?

public static void validate(File xml, InputStream xsd) { 
    try { 
     SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
     Schema schema = factory.newSchema(new StreamSource(xsd)); 
     Validator validator = schema.newValidator(); 
     StreamSource xmlFile = new StreamSource(xml); 
     validator.validate(xmlFile); 

    } catch (SAXException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
+0

这个例子可能会有帮助:http://java-by-ash.blogspot.com/2012/07/xml-schema-validation.html – ThreaT

回答

50

之间Validator validator = schema.newValidator();StreamSource xmlFile = new StreamSource(xml);添加此片段:

final List<SAXParseException> exceptions = new LinkedList<SAXParseException>(); 
    validator.setErrorHandler(new ErrorHandler() 
    { 
    @Override 
    public void warning(SAXParseException exception) throws SAXException 
    { 
     exceptions.add(exception); 
    } 

    @Override 
    public void fatalError(SAXParseException exception) throws SAXException 
    { 
     exceptions.add(exception); 
    } 

    @Override 
    public void error(SAXParseException exception) throws SAXException 
    { 
     exceptions.add(exception); 
    } 
    }); 

这样,validate()后,你会得到异常的完整列表,但是如果出现一个致命错误,停止解析...

编辑:JavaDoc说:应用程序必须假定文档在解析器调用此方法后不可用,并且应该继续(如果有的话)仅用于收集附加的e rror消息:实际上,一旦调用了此方法,SAX解析器可以自由停止报告任何其他事件因此fatalError()可能会或可能不会导致解析停止。