Zum Inhalt springen

[vb.net] XMl-Validator Klasse validiert Schema, ohne dass sie diese zugewiesen kennt


noobvb.net

Empfohlene Beiträge

Hi Leute,

ich hab mal wieder eine Frage an euch.

Ich habe folgende Klasse:

Public Class XmlValidator


    Private ErrorList As List(Of String)

    Private SchemaList As List(Of String)

    Private SchemaReaderSettings As XmlReaderSettings

    Private SchemaValidation As ValidationEventHandler



    'Instanzieren der XmlValidator Klasse

    Public Sub New()

        SchemaList = New List(Of String)

        SchemaReaderSettings = New XmlReaderSettings()

        SchemaValidation = New ValidationEventHandler(AddressOf ValidationHandler)

    End Sub



    ' Bereitstellen der Einstellungen während der  Validierung

    Public ReadOnly Property SchemaSettings() As XmlReaderSettings

        Get

            Return SchemaReaderSettings

        End Get

    End Property



    ' Liste mit absoluten Pfadangaben zu den Schemas, gegen die geprüft werden soll

    Public ReadOnly Property Schemas() As List(Of String)

        Get

            Return SchemaList

        End Get

    End Property


    'Validiert die gegebenen XML-Strings gegen das Schema


    ''' <param name="RawXml">Die rohen XMl Daten, die validiert werden sollen</param>

    ''' <returns>Allgemeine Liste von Fehlermeldungen</returns>

    Public Function ValidateXml(ByVal RawXml As String) As List(Of String)

        ErrorList = New List(Of String)


        If Me.Schemas.Count > 0 Then

            Dim ReaderSettings As New XmlReaderSettings()


            With ReaderSettings

                .ValidationType = ValidationType.Schema

                .ValidationFlags = XmlSchemaValidationFlags.ProcessSchemaLocation Or XmlSchemaValidationFlags.ReportValidationWarnings Or XmlSchemaValidationFlags.AllowXmlAttributes


                For Each SchemaPath As String In Me.Schemas

                    .Schemas.Add(Nothing, XmlReader.Create(SchemaPath, Me.SchemaSettings))

                Next


                AddHandler .ValidationEventHandler, SchemaValidation

            End With


            Using Reader As XmlReader = XmlReader.Create(New StreamReader(RawXml), ReaderSettings) '(New StringReader(RawXml), ReaderSettings)

                While Reader.Read()



                    'Liest das gesamte File und ruft die Validierungs Handler Subrutine auf, 

                    'wenn ein Fehler gefunden wird. Auf diese Weise ist es möglich alle 

                    'Fehler des XML-Files zu ermitteln, anstatt bei jedem Fehler zu stoppen.


                End While

            End Using

        End If


        Return ErrorList


    End Function


    Private Sub ValidationHandler(ByVal sender As Object, ByVal e As System.Xml.Schema.ValidationEventArgs)

        If e.Severity = XmlSeverityType.Error Then

            ErrorList.Add(e.Message)

        End If

    End Sub

End Class

Diese funktioniert auch auf den ersten Blick wunderbar und liefert die Fehlermeldungen zurück, die im XMl-File auftauchen.

Jetzt ist mir aber aufgefallen, dass die Klasse auch Fehler in XML-Files findet, zu denen sie gar kein Schema hat. Das dazugehörige Schema hatte ich zwar mal zu testzwecken verwendet, aber verwende es momentan nicht mehr. Kann es tatsächlich sein, dass die ReaderSettings-Klasse sämtliche jemals verwendete Objekte behält? Das wäre dann doch relativ gefährlich oder?

Kennt sich vielleicht jemand damit aus und weiß vielleicht, wo man das, wenn es denn so wäre, wieder zurücksetzt?

Hoffe, ihr könnt mir Helfen

noob

Link zu diesem Kommentar
Auf anderen Seiten teilen

Kann es tatsächlich sein, dass die ReaderSettings-Klasse sämtliche jemals verwendete Objekte behält? Das wäre dann doch relativ gefährlich oder?

Wenn du immer nur eine Instanz hast und die Liste immer nur füllst und nicht leerst, ist das doch klar oder nicht?!

Kennt sich vielleicht jemand damit aus und weiß vielleicht, wo man das, wenn es denn so wäre, wieder zurücksetzt?

SchemaReaderSettings bei jedem Funktionsaufruf neu instanziieren (dann muss es auch kein Classmember sein) oder die Schemaliste der Instanz leeren.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi TDM,

vielen Dank für deine Antwort.

Ich verwende diesen Aufruf um die Klasse zu verwenden.

 Dim openclass As New XmlValidator

        Dim Pfad As String


        Dim SchemaLocation As New List(Of String)

        Dim i As Integer

        SchemaLocation.Clear()


        If Not TextBox7.Text = "" Then

            SchemaLocation.Add(TextBox7.Text)

        End If

        If Not TextBox4.Text = "" Then

            SchemaLocation.Add(TextBox4.Text)

        End If

        If Not TextBox4.Text = "" Then

            SchemaLocation.Add(TextBox9.Text)

        End If


        openclass.Schemas.Clear()


        For i = 0 To SchemaLocation.Count - 1 Step 1

            ' MsgBox(SchemaLocation(i))

            openclass.Schemas.Add(SchemaLocation(i))

        Next

Mit openclass.Schemas.Clear() sollte doch die Schemaliste geleert werden oder nicht?

Der Fehler besteht nämlich trotzdem. Das ist nämlich mein Problem. Trotz leeren der Liste besteht der Fehler.

Gruß

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi TDM,

so sieht die Property Schemas aus:

' Liste mit absoluten Pfadangaben zu den Schemas, gegen die geprüft werden soll

  Public ReadOnly Property Schemas() As List(Of String)

        Get

            Return SchemaList

        End Get

    End Property

oder ist das jetzt das Falsche?

Beste Grüße

noob

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi TDM,

danke für den Hinweis.

Komm aber irgendwie trotzdem nicht weiter. Die SchemaReaderSettings kennt kein Clear(), sondern nur Remove(), was mich auch nicht weiter bringt.

Außerdem habe ich versucht über reset alle Member zurückzusetzen, was auch nichts bringt.

Hast vielleicht noch nen tipp?

gruß

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi TDM,

du hast geschrieben

SchemaReaderSettings bei jedem Funktionsaufruf neu instanziieren (dann muss es auch kein Classmember sein) oder die Schemaliste der Instanz leeren

Ich komm nicht drauf wie ich das machen soll. Kannst du mir vielelleicht sagen, wie du das machen würdest? Die komplette Klasse habe ich ja bereits gepostet. Wie würdest du diese nun anpassen?

Sorry, dass ich so oft nachfrage, aber ich sollte das heute noch hinbekommen, da ich das Projekt bald abgeben muss.

gruß

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...