Geschätzte Zeit zum Lesen: circa 2 Minuten

XML mit XSD Validieren Teil II

In Teil I ging es um einen kleinen Einblick. Was ist XSD, wie definiere ich strukturen. Dieser Teil soll kurz einmal zeigen, wie man in den verschiedenen Sprachen, XML mittels XSD validiert.


Validieren in NodeJS

Das Projekt libxmljs ist eine Bibliothek für NodeJS, die es ermöglicht XML via XSD zu parsen. Hier das Beispiel für Nodejs. Bei dem Beispiel ist data1.xml eine XML Datei, welche sich nicht gegen das Schema mit Erfolg validieren lässt.

Hier der Link zum NodeJS Beispiel Projekt. nodejsTestXml-XSD-Validierung.zip.

var x = require('libxmljs');
  fs = require('fs');
  var events = require('events');
  
  var xml0 = xml1 = '', eventEmitter = new events.EventEmitter();

  var validate = function(xsd) {
    var xsdDoc = x.parseXmlString(xsd);

    fs.readFile('./data0.xml', 'utf8', function (err,data) {
      if (err) {
        return console.log(err);
      }
      var xmlDoc0 = x.parseXmlString(data);
      var result0 = xmlDoc0.validate(xsdDoc);
      console.log("result0:", result0);
    });

    fs.readFile('./data1.xml', 'utf8', function (err,data) {
      if (err) {
        return console.log(err);
      }
      var xmlDoc1 = x.parseXmlString(data);
      var result1 = xmlDoc1.validate(xsdDoc);
      console.log("result1:", result1);    
    });
  }

  eventEmitter.on('xsdReady', validate);

  fs.readFile('./shema.xsd', 'utf8', function (err,data) {
    if (err) {
      return console.log(err);
    }
    eventEmitter.emit('xsdReady', data);
  });

Validieren in C#.Net

In der .Net Welt haben wir schon alle Mittel an Bord um die beiden Dateien zu validieren. Zu beachten ist hier das an den beiden XML Dateien direkt das Schema in der kapselnden Node <document> angegeben sein muss.

Hier noch der Link zum Beispiel Projekt. XML_Validation_with_XSD.zip.

class Program
{
    static void Main(string[] args)
    {
        //Schema laden.
        var schemaSet = new XmlSchemaSet();
        schemaSet.Add("urn:test-schema", "Schema.xsd");

        //Validieren der XML Dateien
        Validate("data0.xml", schemaSet);
        Validate("data1.xml", schemaSet);

        Console.ReadLine();
    }

    private static void Validate(String filename, XmlSchemaSet schemaSet)
    {
        Console.WriteLine();
        Console.WriteLine("\r\nValidiere XML Datei {0}...", filename);

        XmlSchema compiledSchema = null;

        foreach (XmlSchema schema in schemaSet.Schemas())
        {
            compiledSchema = schema;
        }

        XmlReaderSettings settings = new XmlReaderSettings();
        settings.Schemas.Add(compiledSchema);
        // Callback Handler in den Settings angeben
        settings.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack);
        settings.ValidationType = ValidationType.Schema;

        XmlReader vreader = XmlReader.Create(filename, settings);

        while (vreader.Read()) { }

        vreader.Close();
    }

    private static void ValidationCallBack(object sender, ValidationEventArgs args)
    {
        if (args.Severity == XmlSeverityType.Warning)
            Console.WriteLine("\tWarnung: Matching schema not found."+
            "  No validation occurred." + args.Message);
        else
            Console.WriteLine("\tValidierungsfehler: " + args.Message);

    }
}

Validieren in Java

Ähnlich der .Net Welt existiert auch in Java schon alles, um xml via xsd zu validieren. Die Klasse javax.xml.validation.SchemaFactory liefert uns hier ein Faktory Objekt zurück, welches uns über die Methode newSchema und dem File passend zu unserem XSD ein Schema erstellt. Mit diesem Schema können wir uns einen javax.xml.validation.Validator erstellen lassen welcher dann die XML Files gegen das Schema validiert.

Auch hier wieder der Link zum Beispiel Projekt. javaXML-XSD-Validation-example.zip.

public class Validator {
  public boolean validateXMLSchema(String xsdPath, String xmlPath){
        
        try {
            SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
            Schema schema = factory.newSchema(new File(xsdPath));
            javax.xml.validation.Validator validator = schema.newValidator();
            validator.validate(new StreamSource(new File(xmlPath)));
        } catch (IOException | SAXException e) {
            System.out.println("Exception: "+e.getMessage());
            System.out.println("XML File :  " + xmlPath);
            return false;
        }
        System.out.println("Succesfull validated  " + xmlPath + " againts" + xsdPath);
        return  true;
    }
}