【问题标题】:How to validate XML against Schema in VB.net如何在 VB.net 中根据 Schema 验证 XML
【发布时间】:2013-02-26 12:00:03
【问题描述】:

我正在尝试根据架构验证 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

【问题讨论】:

  • ValidationEventHandler 方法是否被调用?
  • 查看已询问的问题请参考 [this][1] 示例 [1]:stackoverflow.com/questions/8595875/…
  • 嗨史蒂文,ValidationEventHandler 方法永远不会被调用..谢谢。有什么线索吗?
  • 嗨桑迪,我已经检查了你发布的问题..它不相关..它没有使用架构,所以我不能使用那个帖子..谢谢..
  • 无论何时向您自己的问题添加任何评论,您都会收到通知,但像 @sandy 和我这样的其他人不会。如果您希望通知其他人,则需要在其姓名后加上 @ 符号。

标签: xml vb.net xsd


【解决方案1】:

您正在混合使用两种不同的方式来读取 XML 文件。您正在使用 XmlReader 对象和 XmlDocument 对象。通常,您只会使用其中一种。正如您所做的那样,两者都可以使用,但它确实会引入一些不必要的混淆。

验证不起作用的原因是您正在向阅读器添加架构验证,但随后您将 ValidationEventHandler 方法附加到 XmlDocument 对象。 XmlDocumentXmlReader 都能够执行模式验证,并且它们都有自己的 XmlSchemaSet 和验证事件处理程序,用于执行验证。你已经把他们需要的一半给了他们每个人,而不是他们需要的全部给了他们一个或另一个。换句话说,你做了以下事情:

  • XmlReader 的架构:SET
  • XmlReader 的事件处理程序:未设置
  • XmlDocument 的架构:未设置
  • 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...

【讨论】:

  • 感谢您的回答 Steven,这真的很好.. 但我仍然试图接受所有.. 所以如果我将 eventHandler 设置为 XMLReaderSettings,我还做 document.Validate(eventHandler) 吗?我还需要将 eventHandler 设置为 Document 吗?
  • 如果您使用XmlReader 进行验证,那么您根本不需要使用XmlDocument。您只需要循环阅读整个文档,直到结束。如果您想将XmlDocument 对象与XmlReader 结合使用,它会在您调用Load 时为您完成。所以,在这种情况下,没有理由调用Validate 方法。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2016-07-09
    • 1970-01-01
    • 1970-01-01
    • 2013-03-22
    • 1970-01-01
    • 1970-01-01
    • 2014-04-10
    • 1970-01-01
    • 2018-03-27
    相关资源
    最近更新 更多