2012-06-21 49 views
26

Tengo un código estándar como el siguiente para validar xml contra xsd, pero lanza una excepción en el primer error y se detiene. ¿Cómo validar xml, pero continuar con el primer y el siguiente error y obtener todos al final? ¿Es posible?¿Cómo validar xml contra xsd y obtener errores * 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

Este ejemplo podría ser útil: http://java-by-ash.blogspot.com/2012/07/xml-schema-validation.html – ThreaT

Respuesta

50

Entre Validator validator = schema.newValidator(); y StreamSource xmlFile = new StreamSource(xml); añadir este fragmento:

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

De esta manera, después de validate() que obtendrá la lista completa de excepciones, pero si se produce un error fatal, el procesamiento se detiene ...

EDITAR: el JavaDoc dice: La aplicación debe suponer que el documento no se puede utilizar después de que el analizador haya invocado este método, y debe continuar (si es que lo hace) solo con el fin de recopilar datos adicionales. Mensajes rror: de hecho, Los analizadores SAX son libres de dejar de informar cualquier otro evento una vez que se haya invocado este método. Por lo tanto, fatalError() puede o no hacer que el análisis se detenga.

Cuestiones relacionadas