# Tags oder Zeilen der Not-Validen XML-Datei



## Guest (23. Jul 2008)

Hallo zusammen,

ich hab folgende Methode geschrieben.


```
public static void Validierung(String xml, String xsd) throws Exception {	
	DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
	factory.setNamespaceAware(true);
		
		
	try {
		DocumentBuilder builder = factory.newDocumentBuilder();
		Document doc = builder.parse(new File(xmlpfad + schemaTyp + "\\" + xml));
		SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
		Schema schema = schemaFactory.newSchema(new File(xsd));
		Validator validator = schema.newValidator();
		validator.validate(new DOMSource(doc));
			
		System.out.println(xml + " ist valide.");
	} catch (SAXParseException spe) {
		System.out.println(xml + " ist nicht valide." + "\r\n  Message: " + spe.getMessage());
	} catch (SAXException sxe) {
		Exception x = sxe;
		if (sxe.getException() != null)
			x = sxe.getException();
		throw new Exception("Error during parsing.", x);
	} catch (ParserConfigurationException pce) {
		throw new Exception("Parser with specified options can't be built.", pce);
	} catch (IOException ioe) {
		throw new Exception("Error reading file.", ioe);
	}
}
```

funktionieren tut die, aber ich möchte gerne die Tags aus der xml Datei ausgeben lassen, an welcher Stelle der Fehler aufgetretten ist. Jedoch hab ich keine Ahnung wie. Und wenn nicht den Tag, dann wenigstens die Zeile. 

Die Zeile hab ich mit:

```
System.out.println(spe.getLineNumber());
```
versucht, jedoch kommt da immer nur -1 raus.

Kann mir da jemand helfen??


----------



## foobar (23. Jul 2008)

Dafür gibts den ErrorHandler: http://www.java-forum.org/de/viewtopic.php?t=8325


----------



## Guest (28. Jul 2008)

Also, ich hab die letzten Tage immer versucht den ErrorHandler in mein Programm einzubinden. Jedoch, habe ich Problem, dass es nicht so funktioniert, wie ich mir denke, dass es funktioieren soll. Vielleicht bin ich einfach zu doof:


Dies ist die Methode zum Validieren:

```
public static void Validierung(String xml, String xsd) throws Exception {	
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		factory.setValidating(true);
		
		SchemaFactory schemaFactory = null;		
		Validator validator = null;
		DocumentBuilder builder = null;
		Document doc = null;
		
		try {
			builder = factory.newDocumentBuilder();
			builder.setErrorHandler(new SchemaErrorHandler()); 
			
			doc = builder.parse(xml));
			
						
			schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
			Schema schema = schemaFactory.newSchema(new File(xsd));
			validator = schema.newValidator();
			validator.validate(new DOMSource(doc));
					
			fillLog_OK(xml + " ist valide.\r\n");
		} catch (SAXParseException spe) {
                        // Hier passiert der Fehler!!!!!!!!!!!!!!
			validator.getErrorHandler().error(spe);
						
			String message = xml + " ist nicht valide." + "\r\n  Message: " + spe.getMessage();
			fillLog_NOK(message);
		} catch (SAXException sxe) {
			Exception x = sxe;
			if (sxe.getException() != null)
				x = sxe.getException();
			throw new Exception("Error during parsing.", x);
		} catch (ParserConfigurationException pce) {
			throw new Exception("Parser with specified options can't be built.", pce);
		} catch (IOException ioe) {
			throw new Exception("Error reading file.", ioe);
		}
	}
```


Dies ist die SchemaErrorHandler - Klasse:

```
public class SchemaErrorHandler implements ErrorHandler {

	public void error(SAXParseException error) throws SAXException {
		System.out.println("\n ### Parse Error ### " + "\nLine: " + error.getLineNumber() + " Column: " + error.getColumnNumber() + "\nFile: " + error.getSystemId()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
	    System.out.println("PublicID: " + error.getPublicId()); //$NON-NLS-1$
	    System.out.println("PublicID: " + error.getPublicId()); //$NON-NLS-1$
	    System.out.println("\n" + error.getMessage()); //$NON-NLS-1$ 
	}

	public void fatalError(SAXParseException error) throws SAXException {
		System.out.println("\n ### Fatal Parse Error ### " + "\nLine: " + error.getLineNumber() + " Column: " + error.getColumnNumber() + "\nFile: " + error.getSystemId()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
	    System.out.println("PublicID: " + error.getPublicId()); //$NON-NLS-1$
	    System.out.println("PublicID: " + error.getPublicId()); //$NON-NLS-1$
	    System.out.println("\n" + error.getMessage()); //$NON-NLS-1$ 
	}

	public void warning(SAXParseException error) throws SAXException {
		System.out.println("\n ### Parse Warning ### " + "\nLine: " + error.getLineNumber() + "\n File: " + error.getSystemId()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
	    System.out.println("\n" + error.getMessage()); //$NON-NLS-1$ 
	}

}
```


Kann mir villeicht jemand helfen, ist sehr wichtig! (Stelle des Fehlers ist markiert)!!!!

Ich brauiche die Namen der Tags, an der die Fehler auftretten.


----------



## foobar (28. Jul 2008)

In der error.getMessage() steht doch alles drin was du brauchst. Ansonsten mußt du dir über die Line und Columnnumber die dazugehörigen Knoten holen.


----------



## Guest (29. Jul 2008)

An der Stelle 


```
validator.getErrorHandler().error(spe);
```

taucht aber eine NullPointerException auf.

Und an der Stelle spe.getMessage() in der Validierung-Methode wird nur der Fehler aber nicht die Zeile angegeben.


----------



## foobar (29. Jul 2008)

```
catch (SAXParseException spe) {
                        // Hier passiert der Fehler!!!!!!!!!!!!!!
         validator.getErrorHandler().error(spe);
```
Das ist ja sowiso Quatsch. Der Errorhandler wird vom Saxparser aufgerufen und nicht extern. Im ErrorHandler selber sind alle Infos enthalten, die du brauchst also Augen auf.


----------



## Guest (4. Aug 2008)

Hallo alle zusammen,

ich bins schon wieder. Diesmal geht es nicht darum, dass ich tags und zeilen haben wirll, aber ich wollte nicht schon wider ein neues Thema eröffnen und euch alle zum nerven.


```
public static void Validierung(String xml, String xsd) throws Exception {
		SchemaErrorHandler seh = new SchemaErrorHandler();
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		
		try {
			DocumentBuilder builder = factory.newDocumentBuilder();
			builder.setErrorHandler(seh); 
						
			Document doc = builder.parse(new File(xml));
			SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
			Schema schema = schemaFactory.newSchema(new File(xsd));
			Validator validator = schema.newValidator();
			validator.validate(new DOMSource(doc));
			
			System.out.println(xml + " ist valide.\r\n");
		} catch (SAXParseException spe) {	
			System.out.println(seh.errorMessage + "\r\n" + spe.getLocalizedMessage());
		} catch (SAXException sxe) {
			Exception x = sxe;
			if (sxe.getException() != null)
				x = sxe.getException();
			throw new Exception("Error during parsing.", x);
		} catch (ParserConfigurationException pce) {
			throw new Exception("Parser with specified options can't be built.", pce);
		} catch (IOException ioe) {
			throw new Exception("Error reading file.", ioe);
		}
	}
```

Das Problem ist, dass ich bei jeder XML-Datei folgenden Fehler bekomme. 

FEHLER:  'cvc-elt.1: Cannot find the declaration of element 'document'.'

Das liegt aber nicht in der xml-datei und auch nicht am Schema, die hab ich so mit einem Parser getestet. Aber im Java-Programm kommt immer diese Meldung!

Liebe Grüße


----------



## foobar (5. Aug 2008)

> Das liegt aber nicht in der xml-datei und auch nicht am Schema, die hab ich so mit einem Parser getestet.


Das heisst noch nicht viel. Nicht alle Parser halten sich an die Specification und liefern daher unterschiedliche Resultate.

Fliegt denn eine Exception? Vielleicht wurde das Schema nicht gefunden.


----------

