# Validator



## Shoox (21. Okt 2010)

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:


```
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 (21. Okt 2010)

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


----------



## Shoox (21. Okt 2010)

vorher probieren wäre eine gute lösung ... bin auch grad draufgekommen ^^
danke trotzdem


----------



## fkh (21. Okt 2010)

Hallo


```
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.


```
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.


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

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


```
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


----------



## Shoox (21. Okt 2010)

wow, das ist wirklich eine gute Lösung und genau was ich brauche, besten Dank =)


----------

