2012-09-04 10 views
8

Nachdem ich nach dem besten Ansatz zur Validierung meiner XML-Datei gegen eine XSD gesucht hatte, stieß ich auf java.xml.validator.So erhalten Sie spezifischere Fehler beim Validieren von XML anhand einer XSD mit java.xml.validator

I unter Verwendung des Beispielcodes aus der API und das Hinzufügen meiner eigenen Fehlerbehandler

Das funktioniert gut, aber begann, die Nachricht an meine XsdValidationErrorHandler vergangen ist nicht geben Sie mir einen Hinweis auf genau dort, wo in dem Dokument der säumige XML ist:

"org.xml.sax.SAXParseException: cvc-complex-type.2.4.a: Invalid content was found starting with element 'X'. One of '{Y}' is expected." 

gibt es eine Möglichkeit für mich, einen anderen Abschnitt von Validator außer Kraft zu setzen oder in Plug-, so dass ich meine eigene Fehlermeldungen an den Fehlerbehandler definieren können alle neu zu schreiben, ohne gesendet des Codes?

Sollte ich eine andere Bibliothek verwenden?

Antwort

9

Versuchen Sie SaxParseException abzufangen, es ist ein Nachkomme von SaxException. Wenn Sie eine von ihnen bekommen, hat es Methoden getLineNumber(), getColumnNumber() etc.

+0

Sie haben Recht, es hat eine getLineNumber() -Methode - ich hatte das verpasst. Die Zeilennummer ist auch etwas Sinnvolles - wenn es mir nicht gelingt, etwas spezifischere Informationen aus den Daten selbst zu bekommen, kann ich das verwenden. – Levity

3

Zum Zeitpunkt der Analyse validieren. Dadurch werden die Standortinformationen verfügbar und der ErrorHandler meldet es.

Erstellen Sie einfach die Schema, bevor Sie die DocumentBuilderFactory erstellen, und wenden Sie es wie folgt aus:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
dbf.setNamespaceAware(true); 
dbf.setValidating(false); 
dbf.setSchema(schema); 

Hinweis: Die setValidating() Methode teilt dem DBF, ob oder nicht DTD-Validierung zu verwenden. Durch das Festlegen des Schemas wird festgelegt, dass die Schemaüberprüfung verwendet werden soll.

+0

Dies ist eine großartige Antwort, da 'getLineNumber()' und '' getColumnNumber' auf SAXParseException' genannt würde -1 zurück gegeben das Szenario in der Frage. Allerdings möchte ich die Antwort mit Informationen erweitert, dass der Parser einen Fehlerhandler benötigt. Nahm mich eine Weile, um genau herauszufinden, wie man es richtig macht. – Magnilex

3

Sie können exception.getLineNumber() und exception.getColumnNumber() tun, um die Fehler zu erhalten. This ist eine ähnliche Frage.

+0

gibt es eine Möglichkeit, den Tag-Namen, der Fehler erhalten hat, zu erhalten – Gnana

0
public class KitXsdErrorHandler implements ErrorHandler { 

    @Override 
    public void warning(SAXParseException exception) throws SAXException { 
     handleMessage("Warning", exception); 
    } 

    @Override 
    public void error(SAXParseException exception) throws SAXException { 
     handleMessage("Error", exception); 
    } 

    @Override 
    public void fatalError(SAXParseException exception) throws SAXException { 
     handleMessage("Fatal", exception); 
    } 

    private String handleMessage(String level, SAXParseException exception) throws SAXException { 
     int lineNumber = exception.getLineNumber(); 
     int columnNumber = exception.getColumnNumber(); 
     String message = exception.getMessage(); 
     throw new SAXException("[" + level + "] Sətr nömrə: " + lineNumber + " Sütun nömrə: " + columnNumber + " message: " + message); 
    } 
} 

Diese Informationen sind hilfreich zu

How to get internalization with validation messages of SAX XML Schema Validator?

http://vijiprakash.blogspot.com/2008/05/custom-error-message-in-xml-xsd.html

Verwandte Themen