2012-06-21 10 views
26

Ich habe einen Standardcode wie unten, um xml gegen xsd zu validieren, aber es wirft Ausnahme beim ersten Fehler und stoppt. Wie validiere ich XML, fahre aber mit den ersten und nächsten Fehlern fort und bekomme sie alle am Ende? Ist es überhaupt möglich ?Wie validiere ich xml gegen xsd und bekomme * ALL * errors?

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

Dieses Beispiel könnte hilfreich sein: http://java-by-ash.blogspot.com/2012/07/xml-schema-validation.html – ThreaT

Antwort

50

Zwischen Validator validator = schema.newValidator(); und StreamSource xmlFile = new StreamSource(xml); dieses Fragment hinzufügen:

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

diese Weise nach validate() finden Sie vollständige Liste der Ausnahmen, aber wenn ein schwerwiegender Fehler auftritt, stoppt das Parsing ...

EDIT: der JavaDoc sagt: Die Anwendung muss davon ausgehen, dass das Dokument unbrauchbar ist, nachdem der Parser diese Methode aufgerufen hat, und sollte (falls überhaupt) nur zum Sammeln von zusätzlichen e Fehlermeldungen: in der Tat, SAX-Parser sind frei, andere Ereignisse zu melden, sobald diese Methode aufgerufen wurde. So fatalError() kann oder kann nicht verursachen, das Parsing zu beenden.

Verwandte Themen