XML-Validierung: Wozu? / XML-Schema Validierung in Java

XML-Schema Validierung in Java

XML-Schema Validierung in Java

➪ Die XML-Schema-Validierung eines XML-Dokuments kann auch über Java aufgerufen werden.

Die Methode loadSchema liest eine XML-Schema-Datei ein und generiert ein Schema-Objekt daraus:


 private static Schema loadSchema(String name) {
  Schema schema = null;
  try {   
   SchemaFactory factory = null;
   factory = SchemaFactory.newInstance(
                         "http://www.w3.org/2001/XMLSchema");
   schema = factory.newSchema(new File(name));  
  } catch (Exception e) {
   try {    
    String language = XMLConstants.W3C_XML_SCHEMA_NS_URI;
    SchemaFactory factory = SchemaFactory.newInstance(language);
    schema = factory.newSchema(new File(name));    
   } catch (Exception ee) {
    System.out.println("Error in Schema loadSchema: " 
          + name 
          + " exception: " 
          + ee.getMessage());
   }
  }
  return schema;
 }

loadSchema kommt zum Einsatz in der Methode validateXml, der die Adressen der XML-Schema-Datei sowie des XML-Dokuments übergeben werden müssen. Das in loadSchema generierte XML-Schema-Objekt generiert im weiteren Verlauf ein Objekt der Klasse Validator, das wiederum einen ErrorHandler (MyErrorHandler, s.u.) benötigt, um die eigentliche SAXSource-basierende Validierung durchführen zu können.


 public static void validateXml(String schemafile, String xmlName) {
  try {   
   Schema schema = loadSchema(schemafile); 
   Validator validator = schema.newValidator();
   MyErrorHandler myhandler = new MyErrorHandler();   
   validator.setErrorHandler(myhandler);
   SAXSource source = null;
   source = new SAXSource(new InputSource(
                new java.io.FileInputStream(xmlName)));
   System.out.println("validating: " + xmlName);
   validator.validate(source); 
   System.out.println("Validation passed.");
   myhandler.closeFileWriter();
  } catch (Exception e) {
   System.out.println("validateXml: IOException " 
                      + e.getMessage());   
  }
 }

Die Klasse MyErrorHandler schreibt Warnungs- bzw. Fehlermeldungen in eine separate Datei, hier habe ich sie im Standardkonstruktor "log.txt" genannt.


class MyErrorHandler implements ErrorHandler {
 private FileWriter plogfilewriter;
 public MyErrorHandler(FileWriter logfilewriter) {
  this.plogfilewriter = logfilewriter;  
 }
 public MyErrorHandler() {
  try {
   this.plogfilewriter = new FileWriter("log.txt");
  } catch (IOException e) {
   e.printStackTrace();
  } 
 }
 public void warning(SAXParseException arg0) 
        throws SAXException {
  try {
   this.plogfilewriter.write("warning: " 
                              + arg0.getMessage() 
                              + "\r\n");
  } catch (IOException e) {
   e.printStackTrace();
  }
 }
 public void fatalError(SAXParseException arg0) 
        throws SAXException {
  try {
   this.plogfilewriter.write("fatalError: " 
                              + arg0.getMessage() 
                              + "\r\n");
  } catch (IOException e) {
   e.printStackTrace();
  }
 }
 public void error(SAXParseException arg0) 
        throws SAXException {
  try {
   this.plogfilewriter.write("error: " 
                              + arg0.getMessage() 
                              + "\r\n");
  } catch (IOException e) {
   e.printStackTrace();
  }
 }
 public void closeFileWriter() {
  try {
   this.plogfilewriter.close();
  } catch (IOException e) {
   e.printStackTrace();
  }
 }
}

wg / 12. April 2018



Fragen? Anmerkungen? Tipps?

Bitte nehmen Sie Kontakt zu mir auf.






Vielen Dank für Ihr Interesse an meiner Arbeit.


V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn

☎ 0151. 750 360 61 * eMail: info10@wilfried-grupe.de

www.wilfried-grupe.de/XSD_Java.html