Tags oder Zeilen der Not-Validen XML-Datei

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hallo zusammen,

ich hab folgende Methode geschrieben.

Code:
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:
Code:
System.out.println(spe.getLineNumber());
versucht, jedoch kommt da immer nur -1 raus.

Kann mir da jemand helfen??
 
G

Guest

Gast
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:
Code:
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:
Code:
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

Top Contributor
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.
 
G

Guest

Gast
An der Stelle

Code:
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

Top Contributor
Code:
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.
 
G

Guest

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

Code:
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

Top Contributor
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.
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben