noobvb.net Geschrieben 22. Juni 2009 Teilen Geschrieben 22. Juni 2009 Hi Leute, hab mal wieder ein Problem. Ich habe folgende Klasse, mit der ich eine XML-Datei gegen ein XML Schema prüfen möchte, aber ich bekomme ständig die Fehlermeldung, dass ich Ungültige Daten auf Stammebene. Zeile1, Position 1 habe. Kann mir aber nicht vorstellen, woran der Fehler liegt. Hatte vielleicht jemand von euch schon das selbe Problem und kennt die Lösung? Die 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 StringReader(RawXml), ReaderSettings) While Reader.Read() 'Lies 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 Der Dazugehörige Aufruf Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim openclass As New XmlValidator Dim Pfad As String Dim SchemaLocation As String Pfad = "PfadzurXMLDatei" SchemaLocation = "PfadzurSchemadatei" openclass.Schemas.Add(SchemaLocation) openclass.ValidateXml(Pfad) MsgBox(openclass.Schemas) End Sub End Class Und die dazugehörigen Schema und XMl Files Schema: <?xml version="1.0" encoding="utf-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name ="security"></xs:element> <xs:element name="password"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:minLength value ="8"/> </xs:restriction> </xs:simpleType> </xs:element> </xs:schema> XML-File: <?xml version="1.0" encoding="utf-8" ?> - <security xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="testschema.xsd"> <password>abcdefgh</password> </security> Vielen Dank schon mal im Voraus Gruß noob Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
noobvb.net Geschrieben 23. Juni 2009 Autor Teilen Geschrieben 23. Juni 2009 Hi Leute, habe mittlererweile den Fehler gefunden. Ich habe die falsche Klasse für mein Problem verwendet. Musste einfach Using Reader As XmlReader = XmlReader.Create(New StringReader(RawXml), ReaderSettings) durchUsing Reader As XmlReader = XmlReader.Create(New StreamReader(RawXml), ReaderSettings) ersetzen. Der Grund dafür ist auch recht simpel. Die StringReader-Klasse erwartet ein XML-File in Form eines Strings. Die StreamReader-Klasse hingegen erwartet einen Pfad. Beste Grüße noobvb.net Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
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.