XML Validierung - wozu? / XML Schema / XML Schema: Datenvalidierung mit VisualBasic.NET

XML Schema: Datenvalidierung mit VisualBasic.NET

XML Schema: Datenvalidierung mit VisualBasic.NET

Die XML Schema - Datenvalidierung eines XML Dokuments kann mit Hilfe leistungsfähiger Klassen in VisualBasic.NET durchgeführt werden.

XML Schema: Datenvalidierung mit VisualBasic.NET

Für einen einfachen Einstieg soll die folgende Logik dienen, die die genannten Namespaces System.Xml bzw. System.Xml.Schema einbezieht, und die durch den Kommandoaufruf mit den entsprechenden Parametern gestartet werden kann:


XML_Schema_Validierung_einfach("C:\wg\Ort_Elemente.xml", "C:\wg\Ort_Elemente.xsd")

Das Konzept beruht auf einem XmlReader, der mit XmlReaderSettings konfiguriert wurde. Die XmlReaderSettings binden hierbei ein XML-Schema-Set ein, setzen den ValidationType und definieren einen separaten Validationhandler "Validierungsfehler_einfach", der bei jedem Validierungsproblem zum Einsatz kommt. Den Rest besorgt der XmlReader in VisualBasic.NET.


  Imports System.Xml
  Imports System.Xml.Schema
  Public Sub XML_Schema_Validierung_einfach(
         xmldatei As String, xsddatei As String)
    Dim settings As New XmlReaderSettings()
    'falls das XML Schema auch einen Namespace beinhaltet:
    'Schemas.Add("http://www.wilfried-grupe.de/Orte", xsddatei)
    settings.Schemas.Add(Nothing, xsddatei)
    settings.ValidationType = ValidationType.Schema
    AddHandler settings.ValidationEventHandler, 
       New ValidationEventHandler(
           AddressOf Validierungsfehler_einfach)
    Dim _xmlreader As XmlReader = XmlReader.Create(xmldatei, settings)
    While _xmlreader.Read
    End While
    _xmlreader.Close()
    Console.WriteLine("OK")
  End Sub

Die Subroutine, die bei jedem Validierungsproblem aufgerufen wird, basiert auf dem im .NET Framework üblichen Handler-Konzept, das zwei Parameter vom Typ Object (sender, ist vom Typ System.Xml.XsdValidatingReader) und ValidationEventArgs beinhaltet. Die ValidationEventArgs evtarg weisen dabei die zwei Severity-Levels "Error" und "Warning" auf.


  ''' <summary>Handler falls Validierung 
  ''' gegen XSD auf einen Fehler läuft</summary>
  Private Sub Validierungsfehler_einfach(
          sender As Object, evtarg As ValidationEventArgs)
    Select Case evtarg.Severity
      Case XmlSeverityType.Error
        Console.Write("Validierungsfehler: ERROR: ")
        Console.WriteLine(evtarg.Message)
      Case XmlSeverityType.Warning
        Console.Write("Validierungsfehler: WARNING: ")
        Console.WriteLine(evtarg.Message)
    End Select
  End Sub

Bei einem XML Input-Dokument, das ich entsprechend präpariert habe, so daß die Validierung auf einen Fehler läuft, ergibt sich dieses Erebnis:


Validierungsfehler: ERROR: Das Element 'Kauf' hat ein 
ungültiges untergeordnetes Element 'preisX'. 
Erwartet wurde die Liste der möglichen Elemente: 'preis, Gesamt'.
XML Datei C:\wg\Ort_Elemente.xml wurde gegen XML Schema validiert

Validierung mit Logdatei

Den vorherigen Ansatz habe ich um eine Logdatei sowie um einen weiteren Handler ergänzt für den Fall, daß das Einlesen des XML Schema-Dokuments schiefgeht. Zudem wird hier das XML Schema-Dokument mit der XmlSchema.Read-Methode eingelesen. Der weitere Ablauf ist im Wesentlichen wie vorher: mit Hilfe von XmlReaderSettings wird ein XmlReader konfiguriert, der bei jedem Validierungsproblem die Subroutine / den ValidationEventHandler "Validierungsfehler" aufruft.


  Dim validationlog As System.IO.StreamWriter
  ''' <summary>XSD-Validierung mit XMLTextReader</summary>
  Public Sub XML_Schema_Validierung(
         xmldatei As String, xsddatei As String, logdateiname As String)
    validationlog = New IO.StreamWriter(logdateiname)
    Dim xsdreader As New XmlTextReader(xsddatei)
    Dim _xs_Schema As XmlSchema
    Dim xmlinputreader As XmlReader
    Try
      _xs_Schema = XmlSchema.Read(xsdreader, 
                   AddressOf Handler_XSD_Datei_Lesefehler)
      _xs_Schema.Write(Console.Out)
      validationlog.WriteLine(_xs_Schema.ToString)
      Dim settings As New XmlReaderSettings()
      settings.Schemas.Add(_xs_Schema)
      settings.ValidationType = ValidationType.Schema
      AddHandler settings.ValidationEventHandler, 
         New ValidationEventHandler(
             AddressOf Validierungsfehler)
      xmlinputreader = XmlReader.Create(xmldatei, settings)
      While xmlinputreader.Read
      End While
      xmlinputreader.Close()
    Catch ex As Exception
      Console.WriteLine(ex.Message)
    Finally
      xsdreader.Close()
      xmlinputreader.Close()
    End Try
    validationlog.WriteLine("XML Datei {0} 
         wurde gegen XML Schema validiert", xmldatei)
    validationlog.Close()
    Console.WriteLine("XML Datei {0} 
         wurde gegen XML Schema validiert", xmldatei)
  End Sub

Die Subroutine Handler_XSD_Datei_Lesefehler ist ebenfalls ein Handler für den Fall, daß das XML Schema nicht korrekt eingelesen werden kann.


  ''' <summary>Handler, falls Einlesen von XML Schema fehlschlägt</summary>
  Private Sub Handler_XSD_Datei_Lesefehler(
          sender As Object, e As ValidationEventArgs)
    Select Case e.Severity
      Case XmlSeverityType.Error
        Console.Write("Handler_XSD_Datei_Lesefehler: ERROR: ")
        Console.WriteLine(e.Message)
        validationlog.Write("Handler_XSD_Datei_Lesefehler: ERROR: ")
        validationlog.WriteLine(e.Message)
      Case XmlSeverityType.Warning
        Console.Write("Handler_XSD_Datei_Lesefehler: WARNING: ")
        Console.WriteLine(e.Message)
        validationlog.Write("Handler_XSD_Datei_Lesefehler: ERROR: ")
        validationlog.WriteLine(e.Message)
    End Select
  End Sub

Wie vorher, arbeitet auch dieses Handlerkonzept mit den beiden Parametern "sender" und "evtarg"; hinzu kommt lediglich das vorher global definierte und hier intern verwendete "validationlog" vom Typ "System.IO.StreamWriter", das die entsprechenden Fehlermeldungen in die Datei schreibt.


  ''' <summary>Handler falls Validierung 
  ''' gegen XSD auf einen Fehler läuft</summary>
  Private Sub Validierungsfehler(
          sender As Object, evtarg As ValidationEventArgs)
    Select Case evtarg.Severity
      Case XmlSeverityType.Error
        Console.Write("Validierungsfehler: ERROR: ")
        Console.WriteLine(evtarg.Message)
        If validationlog IsNot Nothing Then
          validationlog.Write("Validierungsfehler: ERROR: ")
          validationlog.WriteLine(evtarg.Message)
        End If
      Case XmlSeverityType.Warning
        Console.Write("Validierungsfehler: WARNING: ")
        Console.WriteLine(evtarg.Message)
        If validationlog IsNot Nothing Then
          validationlog.Write("Validierungsfehler: WARNING: ")
          validationlog.WriteLine(evtarg.Message)
        End If
    End Select
  End Sub

wg / 10. November 2017



Fragen? Anmerkungen? Tips?

Bitte nehmen Sie Kontakt zu mir auf:

Vorname
Nachname
Mailadresse







Vielen Dank für Ihr Interesse an meiner Arbeit.


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

Mobil: 0151. 750 360 61 * eMail: info2018@wilfried-grupe.de

www.wilfried-grupe.de/XSD_VBNET.html