繁体   English   中英

如何在VB.net中针对Schema验证XML

[英]How to validate XML against Schema in VB.net

我正在尝试针对模式验证xml。 我正在使用XmlReaderSetting并尝试在MSDN上关注示例,但无法使其工作。 即使我针对架构抛出一个完全不同的文件,它也不验证xml。 任何人都可以解释我错过了什么吗?

谢谢,

    Protected Sub ValidateXML(xmlFilePath As String, schemasFilePath As String)

    Try

        Dim settings As XmlReaderSettings = New XmlReaderSettings()

        settings.Schemas.Add("http://www.w3.org/2001/XMLSchema", schemasFilePath)
        settings.ValidationType = ValidationType.Schema

        Dim reader As XmlReader = XmlReader.Create(xmlFilePath, settings)
        Dim document As XmlDocument = New XmlDocument()
        document.Load(reader)

        Dim eventHandler As ValidationEventHandler = New ValidationEventHandler(AddressOf ValidationEventHandler)

        ' the following call to Validate succeeds.
        document.Validate(eventHandler)
        reader.Close()

    Catch ex As Exception
        Messagebox(ex.Message, "error")
    End Try

End Sub

Protected Sub ValidationEventHandler(ByVal sender As Object, ByVal e As ValidationEventArgs)

    Select Case e.Severity
        Case XmlSeverityType.Error
            'Messagebox(e, "error")
        Case XmlSeverityType.Warning
            'Messagebox(e, "error")
    End Select

End Sub

您正在混合两种不同的方式来读取XML文件。 您正在使用XmlReader对象和XmlDocument对象。 通常,您只使用其中一个。 它可以像你一样使用它们,但它确实引入了一些不必要的混淆。

验证无效的原因是您将架构验证添加到阅读器,但随后将ValidationEventHandler方法附加到XmlDocument对象。 XmlDocumentXmlReader都能够执行模式验证,它们每个都有自己的XmlSchemaSet和验证事件处理程序,用于执行验证。 你已经将他们所需要的一半给了他们所需要的一半,而不是他们需要的一半。 换句话说,您已完成以下操作:

  • XmlReader的Schema: SET
  • XmlReader的事件处理程序: NOT SET
  • XmlDocument的架构: NOT SET
  • XmlDocument的事件处理程序: SET

因此,两个对象都没有正确验证所需的所有信息。 XmlReader对象将执行验证,但是您不会收到它发现的任何错误的通知,而XmlDocument对象根本不会进行任何验证,但是有可能在事件中通知您它确实发现了任何验证错误。 要修复它,您需要设置XmlReader对象的验证事件处理程序,或者需要设置XmlDocument对象的架构。 例如:

Dim settings As XmlReaderSettings = New XmlReaderSettings()
settings.Schemas.Add("http://www.w3.org/2001/XMLSchema", schemasFilePath)
settings.ValidationType = ValidationType.Schema
AddHandler settings.ValidationEventHandler, New ValidationEventHandler(AddressOf ValidationEventHandler)
Dim reader As XmlReader = XmlReader.Create(xmlFilePath, settings)
' Read the document...

它没有调用事件处理程序:

Protected Sub ValidationEventHandler(ByVal sender As Object, ByVal e As ValidationEventArgs)

    Select Case e.Severity
        Case XmlSeverityType.Error
            'Messagebox(e, "error")
        Case XmlSeverityType.Warning
            'Messagebox(e, "error")
    End Select

End Sub

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM