XML-Validierung / 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 leistungsfähigen Klassen in VisualBasic.NET durchgeführt werden.

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 via 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 = 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, damit die Validierung auf einen Fehler läuft, ergibt sich dieses Resultat:


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, dass 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 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, dass 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 / 4. April 2018



Fragen? Anmerkungen? Tips?

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_VBNET.html