2009-10-20 2 views
0

Я пытаюсь написать общую функцию VB.NET (VS2005) для проверки XML-документа в отношении XSD. Это работает отлично, пока я использовать XSD с относительным путем включает в себя, как:Проверка XML с использованием нескольких XSD с использованием относительных путей в .NET.

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

Он никогда не может показаться, чтобы найти то, что входит в любых вторичных документах. Вот моя оригинальная функция ниже. Я играю с XmlUrlResolver(), но я тоже не могу добиться какого-либо прогресса. Любая помощь здесь будет принята с благодарностью.

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 

ответ

0

Я решил это путем создания пользовательских XmlUrlResolver так:

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