我正在尝试针对架构验证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
答案 0 :(得分:3)
您正在混合使用两种不同的方式来读取XML文件。您正在使用XmlReader
对象和XmlDocument
对象。通常,您只使用其中一个。正如你所做的那样,它将同时使用它们,但它确实引入了一些不必要的混淆。
验证无效的原因是您将架构验证添加到阅读器,但随后将ValidationEventHandler
方法附加到XmlDocument
对象。 XmlDocument
和XmlReader
都能够执行模式验证,并且它们每个都有自己的XmlSchemaSet
和验证事件处理程序,用于执行验证。你已经将他们所需要的一半给了他们所需要的一半,而不是他们需要的一半。换句话说,您已完成以下操作:
因此,两个对象都没有正确验证所需的所有信息。 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...
答案 1 :(得分:0)
它没有调用事件处理程序:
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