2009-10-20 5 views
0

J'essaye d'écrire une fonction générique VB.NET (VS2005) pour valider un document XML par rapport à un XSD. Cela fonctionne bien jusqu'à ce que j'utilise un XSD avec un chemin relatif comprennent comme:Validation de XML avec plusieurs XSD en utilisant des chemins relatifs dans .NET

<xs:include schemaLocation="test.02.xsd" /> 

Il ne peut jamais sembler trouver ce qui est inclus dans les documents secondaires. Voici ma fonction originale ci-dessous. J'ai joué avec XmlUrlResolver() mais je ne peux pas sembler faire de progrès en utilisant cela non plus. Toute aide est grandement appréciée ici.

Private Sub ValidatingProcess(ByVal XSDPath As String, ByVal XMLPath As String) 
    Try 
     Me.Reader = New XmlTextReader(XMLPath) 
     Dim SR As New StreamReader(XSDPath) 
     Dim Schema As New XmlSchema() 
     Schema = XmlSchema.Read(SR, New ValidationEventHandler(AddressOf ReaderSettings_ValidationEventHandler)) 
     Dim ReaderSettings As New XmlReaderSettings() 
     ReaderSettings.ValidationType = ValidationType.Schema 
     ReaderSettings.Schemas.Add(Schema) 
     AddHandler ReaderSettings.ValidationEventHandler, AddressOf ReaderSettings_ValidationEventHandler 
     Dim objXmlReader As XmlReader = XmlReader.Create(Reader, ReaderSettings) 
     While objXmlReader.Read() 
     End While 
    Catch AccessEx As UnauthorizedAccessException 
     Throw AccessEx 
    Catch Ex As Exception 
     Throw Ex 
    End Try 
End Sub 

Répondre

0

Je l'ai résolu en créant un comme XmlUrlResolver personnalisé ceci:

Class CustomResolver 
    Inherits XmlUrlResolver 

    Private _CustomBaseUri As Uri 

    Public Sub New(ByVal baseUri As Uri) 
     If baseUri.IsFile Then 
      _CustomBaseUri = New Uri(Path.GetDirectoryName(baseUri.LocalPath.ToString()) & "\") 
     Else 
     End If 
     Me._CustomBaseUri = baseUri 
    End Sub 

    Public Overloads Overrides Function ResolveUri(ByVal baseUri As Uri, ByVal relativeUri As String) As Uri 
     If baseUri IsNot Nothing Then 
      Return MyBase.ResolveUri(baseUri, relativeUri) 
     Else 
      Return MyBase.ResolveUri(_CustomBaseUri, relativeUri) 
     End If 
    End Function 
End Class 
Questions connexes