Validator

Shoox

Mitglied
Hallo an alle,

ich hab vor kurzem die tolle Klasse Validator gefunden damit ich die Struktur meines XML mit der Struktur meines XSD vergleichen kann. Tolle Sache, nur wäre es sehr schön, wenn ich irgendwie herausfinden könnte, welche Knoten betroffen waren. Hier mal mein Mega-Code:

Java:
public boolean validate(File xml, File xsd) {
      try {
      SchemaFactory fact = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
      Schema schema = fact.newSchema(new StreamSource(xsd));
      Validator valid = schema.newValidator();
      valid.validate(new StreamSource(xml));
      return true;
      } catch (SAXException sax) {
         return false;
      } catch (IOException ioe) {
         log("Could not read source file: " + ioe.getMessage());
         return false;
      }
   }

Zurzeit macht er nichts anderes als false zurück geben sobald das XML nicht mit dem XSD übereinstimmt und true wenns passt, ich würde aber gerne ein log schreiben wo der Fehler war.
Gibt es da eine Möglichkeit?

Dank im Vorraus,
LG Shoox
 

Sempah

Bekanntes Mitglied
vlt. nicht einfach false zurück liefern, sondern mal schauen was in der Exception steht. catch (SAXException sax) {
...
 

fkh

Mitglied
Hallo

Java:
SchemaFactory fact = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");

Anstatt "http://www.w3.org/2001/XMLSchema" würde ich den Einsatz von XMLConstants.W3C_XML_SCHEMA_NS_URI empfehlen.

Zurzeit macht er nichts anderes als false zurück geben sobald das XML nicht mit dem XSD übereinstimmt und true wenns passt, ich würde aber gerne ein log schreiben wo der Fehler war.
Gibt es da eine Möglichkeit?

Ja, die gibt es - nennt sich DefaultHandler (Java Platform SE 6). Zuerst einmal musst du eine solche Klasse implementieren. Nachfolgend ein kleines Beispiel, wie das aussehen könnte.

Java:
public class DefaultErrorHandler extends DefaultHandler {
    public void warning(SAXParseException e) {
        System.out.println("Warning: ");
        printInfo(e);
    }

    public void error(SAXParseException e) {
        System.out.println("Error: ");
        printInfo(e);
    }

    public void fatalError(SAXParseException e) {
        System.out.println("Fatal error: ");
        printInfo(e);
    }

    private void printInfo(SAXParseException e) {
        System.out.println("   Public ID: " + e.getPublicId());
        System.out.println("   System ID: " + e.getSystemId());
        System.out.println("   Line number: " + e.getLineNumber());
        System.out.println("   Column number: " + e.getColumnNumber());
        System.out.println("   Message: " + e.getMessage());
    }
}

Als nächstes musst du diese Klasse noch bei deinem Validator bekannt machen.

Java:
Validator validator = schema.newValidator();
validator.setErrorHandler(new DefaultErrorHandler());

Eine mögliche Ausgabe wäre dann z.B. folgendes.

Code:
Error: 
   Public ID: null
   System ID: null
   Line number: 13
   Column number: 10
   Message: cvc-complex-type.2.4.a: Invalid content was found starting with element 'test'. One of '{Bibliographic}' is expected.

Viele Grüße
fkh
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Shoox Validator get invalid Nodename XML & JSON 6

Ähnliche Java Themen

Neue Themen


Oben