Tags oder Zeilen der Not-Validen XML-Datei

  • Themenstarter Themenstarter Guest
  • Beginndatum Beginndatum
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??
 
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.
 
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.
 
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.
 
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.
 
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
 
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.

Zurück
Oben