Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在VB.net中根据模式验证XML_Xml_Vb.net_Xsd - Fatal编程技术网

如何在VB.net中根据模式验证XML

如何在VB.net中根据模式验证XML,xml,vb.net,xsd,Xml,Vb.net,Xsd,我试图根据模式验证xml。我正在使用XmlReaderSetting并尝试在MSDN上使用一个示例,但无法使其正常工作。即使我针对模式抛出一个完全不同的文件,它也不会验证xml。谁能解释一下我遗漏了什么 谢谢 Protected Sub ValidateXML(xmlFilePath As String, schemasFilePath As String) Try Dim settings As XmlReaderSettings = New XmlRead

我试图根据模式验证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
对象。
XmlDocument
XmlReader
都能够执行模式验证,并且它们都有自己的
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...

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

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]:嗨,Steven,ValidationEventHandler方法从未被调用过。。谢谢有什么线索吗?嗨,桑迪,我查过你贴的问题了。。这无关紧要。。它没有使用模式,所以我不能使用该帖子。。谢谢..当您的问题中添加任何评论时,您都会收到通知,但其他人如@sandy和我不会。如果你想通知其他人,你需要在@符号后面加上他们的名字。谢谢你的回答,史蒂文,这真的很好。。但我仍在努力接受所有。。所以,如果我将eventHandler设置为XMLReaderSettings,我是否仍然执行document.Validate(eventHandler)?我是否还需要将eventHandler设置为Document?如果您使用
XmlReader
进行验证,则根本不需要使用
XmlDocument
。您只需循环阅读整个文档,直到到达结尾。如果您想将
XmlDocument
对象与
XmlReader
结合使用,则在调用
Load
时,它将为您提供完全相同的功能。因此,在这种情况下,没有理由调用
Validate
方法。