2009-10-20 20 views
0

我正在尝试编写一个通用的VB.NET(VS2005)函数来验证针对XSD的XML文档。这工作正常,直到我使用XSD的相对路径包括像:使用多个XSD在.NET中使用相对路径验证XML

<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