簡體   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