如何在VB.net中根据模式验证XML
我试图根据模式验证xml。我正在使用XmlReaderSetting并尝试在MSDN上使用一个示例,但无法使其正常工作。即使我针对模式抛出一个完全不同的文件,它也不会验证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
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
方法。