noobvb.net Geschrieben 2. Juli 2009 Geschrieben 2. Juli 2009 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 Zitieren
TDM Geschrieben 2. Juli 2009 Geschrieben 2. Juli 2009 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. Zitieren
noobvb.net Geschrieben 2. Juli 2009 Autor Geschrieben 2. Juli 2009 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ß Zitieren
noobvb.net Geschrieben 3. Juli 2009 Autor Geschrieben 3. Juli 2009 Hi TDM, kannst du mir sagen, ob ich die Instanz richtig geleert hab oder nicht. Der Fehler wird dadurch nicht behoben und ich bin etwas ratlos, wie ich die Hilfe von dir umsetzen soll. Beste Grüße noob Zitieren
TDM Geschrieben 3. Juli 2009 Geschrieben 3. Juli 2009 Dim SchemaLocation As New List(Of String) Dim i As Integer SchemaLocation.Clear() Bissl sinnlos, hmm?! Ansonsten: Zeig mal die Property [i]Schemas[/i], damit ich mir ein Bild machen kann. Zitieren
noobvb.net Geschrieben 3. Juli 2009 Autor Geschrieben 3. Juli 2009 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 Zitieren
TDM Geschrieben 3. Juli 2009 Geschrieben 3. Juli 2009 Naja, ich sag mal so: Wenn du diese Liste leerst, interessiert das SchemaReaderSettings.Schemas nicht. Zitieren
noobvb.net Geschrieben 3. Juli 2009 Autor Geschrieben 3. Juli 2009 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ß Zitieren
noobvb.net Geschrieben 3. Juli 2009 Autor Geschrieben 3. Juli 2009 Hi TDM, du hast geschriebenSchemaReaderSettings 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ß Zitieren
Empfohlene Beiträge
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.