# Validator get invalid Nodename



## Shoox (16. Nov 2010)

Hallo,
ich habe eine kleine xml checker klasse geschrieben und ich würde gern, wenn die validation fehlgeschlagen ist, den Namen des Knoten erfahren, der das Problem verursacht hat.
Hier ist einmal die Methode fürs validieren.


```
public void validate(File xml, File xsd) throws SAXException, IOException{
      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));
   }
```
Ich hab schon versucht mit einem StreamResult was zu erreichen, aber irgendwie hat mir das nicht den gewünschten Erfolg eingebracht.
Muss ich hier einen ErrorHandler schreiben/zuweisen damit ich den Knoten heraus bekomme? Gibt da eine "best practice" Lösung? Oder muss ich die SAXException weiter auseinander zerpflücken?

Vielen Dank im vorraus.
LG Shoox


----------



## DerEisteeTrinker (16. Nov 2010)

Versuch es mal mit der SAXParseException. Vllt liefert dir das validate das zurück


----------



## Shoox (16. Nov 2010)

Die SAXParseException wird vom validate geworfen mit folgender Ausgabe:

```
com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195)
com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(ErrorHandlerWrapper.java:131)
com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:384)
com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:318)
com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator$XSIErrorReporter.reportError(XMLSchemaValidator.java:417)
com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.reportSchemaError(XMLSchemaValidator.java:3181)
com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.elementLocallyValidType(XMLSchemaValidator.java:3096)
com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.processElementContent(XMLSchemaValidator.java:3006)
com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.handleEndElement(XMLSchemaValidator.java:2149)
com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.endElement(XMLSchemaValidator.java:817)
com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(XMLDocumentFragmentScannerImpl.java:1782)
com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2938)
com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648)
com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:140)
com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:511)
com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:808)
com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
com.sun.org.apache.xerces.internal.jaxp.validation.StreamValidatorHelper.validate(StreamValidatorHelper.java:144)
com.sun.org.apache.xerces.internal.jaxp.validation.ValidatorImpl.validate(ValidatorImpl.java:111)
javax.xml.validation.Validator.validate(Validator.java:127)
```
hmm... hilft mir glaub ich aber nicht wirklich weiter.


----------



## DerEisteeTrinker (16. Nov 2010)

dann probier mal die Getter der SAXParseExcpetion aus (siehe JavaDocs), vllt steht da etwas geeignetes drin.


----------



## Shoox (16. Nov 2010)

hmm... die Zeilennummer bekomm ich da schon mal mit getLineNumer() raus. Das getPublicId() liefert zwar null, aber nja, Zeilennummer is ja eigentlich besser als "Name" wenn da 3000 Tags drinn sind, die "Name" heißen ^^

danke für die Hilfe.


----------



## DerEisteeTrinker (17. Nov 2010)

Das Problem kann nur sein, dass du vllt ein XML-Dokument hast, was nur eine Zeile hat. Ich verarbeite in der Regel immer nur XMLs, die jungfräulich in Bezug auf Zeilenumbrüche sind.


----------



## Shoox (17. Nov 2010)

nope, mein XML (und auch das XSD) ist definitiv mit Zeilenumbrüchen und Einrückungen, aber mit der SAXParseException kann ich schon mal gut arbeiten, aber ich werde versuchen heraus zu bekommen, warum das getPublicId() nicht hinhaut, laut Doc liefert es null wenn kein Identifier verfügbar ist...


----------

