Gern stehe ich zur fachlichen Unterstützung in XML-Technologien, C#.NET, VisualBasic.NET und Java zur Verfügung. Sprechen Sie mich einfach an: Mail oder ☎ 0151 . 750 360 61


XML-Validierung: Wozu? / 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.

Auf dieser Seite:

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