在没有ValidationEventHandler的情况下针对模式验证XDocument(用于HTTP处理程序)

时间:2010-02-26 11:39:58

标签: validation .net-3.5 xsd linq-to-xml event-handling

(我是Schema验证的新手)

关于以下方法,

System.Xml.Schema.Extensions.Validate(
    ByVal source As System.Xml.Linq.XDocument, 
    ByVal schemas As System.Xml.Schema.XmlSchemaSet,
    ByVal validationEventHandler As System.Xml.Schema.ValidationEventHandler, 
    ByVal addSchemaInfo As Boolean)

我在IHttpHandler中使用它如下 -

Try      
  Dim xsd As XmlReader = XmlReader.Create(context.Server.MapPath("~/App_Data/MySchema.xsd"))
  Dim schemas As New XmlSchemaSet() : schemas.Add("myNameSpace", xsd) : xsd.Close()
  myXDoxumentOdj.Validate(schemas, Function(s As Object, e As ValidationEventArgs) SchemaError(s, e, context), True)
Catch ex1 As Threading.ThreadAbortException
  'manage schema error'
  Return
Catch ex As Exception
  'manage other errors'
End Try

处理程序 -

  Function SchemaError(ByVal s As Object, ByVal e As ValidationEventArgs, ByVal c As HttpContext) As Object
    If c Is Nothing Then c = HttpContext.Current
    If c IsNot Nothing Then
      HttpContext.Current.Response.Write(e.Message)
      HttpContext.Current.Response.End()
    End If
    Return New Object()
  End Function

目前这对我来说很好,但看起来很弱。当我提供错误的XML时,我确实遇到了错误。但我想以更优雅的方式实现它。看起来它会破坏大型XML等。

有没有办法在没有处理程序的情况下进行验证,以便我一次性验证文档,然后处理错误?

对我而言,它看起来像Async,因此对Validate()的调用将会通过,而某些非确定性的时间将会在结果/错误中调用处理程序。是吗?

感谢和抱歉任何愚蠢的错误:)。

1 个答案:

答案 0 :(得分:1)

我一直在使用上面的代码已经有一段时间了,我对它是Async不正确。在验证整个文档之前,它不会移动到下一个语句。