VB.NET根据XSD文件验证XML文件并通过xml解析
我需要做什么? 我需要根据XSD文件(传递文件路径/位置)验证XML文件(传递文件路径/位置)。我需要检查它没有非法字符,并且它具有在XSD中定义的所有标签,即没有标签缺失。它匹配在xsd中定义的数据类型。在完成之后,我需要解析xml文件以获取数据并将其存储在数据库中。VB.NET根据XSD文件验证XML文件并通过xml解析
有问题? 1)使用XmlReaderSetttings与XmlDocument和XmlReader与验证方法将帮助我达到我需要的? CAn任何人都可以帮助我使用sampel代码?
2)什么是解析XML文件以获取特定标签的最佳方式?
我是VB.net的新手,所以任何示例代码的帮助将不胜感激。谢谢!
是的,你是在正确的轨道上。验证XML文档可以使用XmlDocument
或XmlReader
(我将在后面描述,也可以使用XDocument
)完成。你选择哪一个取决于你的情况,但它们都是相似的。当他们发现文档有错误时,他们会致电ValidationEventHandler
委托人。 XmlReader
通过对象中的事件调用它,而XmlDocument
通过作为其参数Validate
方法传递的委托来调用它。下面是一个简单的类,可用于收集错误:
Public Class XmlValidationErrorBuilder
Private _errors As New List(Of ValidationEventArgs)()
Public Sub ValidationEventHandler(ByVal sender As Object, ByVal args As ValidationEventArgs)
If args.Severity = XmlSeverityType.Error Then
_errors.Add(args)
End If
End Sub
Public Function GetErrors() As String
If _errors.Count <> 0 Then
Dim builder As New StringBuilder()
builder.Append("The following ")
builder.Append(_errors.Count.ToString())
builder.AppendLine(" error(s) were found while validating the XML document against the XSD:")
For Each i As ValidationEventArgs In _errors
builder.Append("* ")
builder.AppendLine(i.Message)
Next
Return builder.ToString()
Else
Return Nothing
End If
End Sub
End Class
该班ValidationEventHandler
方法ValidationEventHandler
委托的签名相匹配,这样你就可以用它来无论从XmlReader
或收集错误XmlDocument
。这里是你如何能与XmlDocument
使用它:
Public Function LoadValidatedXmlDocument(xmlFilePath As String, xsdFilePath As String) As XmlDocument
Dim doc As New XmlDocument()
doc.Load(xmlFilePath)
doc.Schemas.Add(Nothing, xsdFilePath)
Dim errorBuilder As New XmlValidationErrorBuilder()
doc.Validate(New ValidationEventHandler(AddressOf errorBuilder.ValidationEventHandler))
Dim errorsText As String = errorBuilder.GetErrors()
If errorsText IsNot Nothing Then
Throw New Exception(errorsText)
End If
Return doc
End Function
而且这里是你如何能与XmlReader
使用它:
Public Sub LoadXml(xmlFilePath As String, xsdFilePath As String)
Dim settings As New XmlReaderSettings()
settings.Schemas.Add(Nothing, xsdFilePath)
settings.ValidationType = ValidationType.Schema
Dim errorBuilder As New XmlValidationErrorBuilder()
AddHandler settings.ValidationEventHandler, New ValidationEventHandler(AddressOf errorBuilder.ValidationEventHandler)
Dim reader As XmlReader = XmlReader.Create(xmlFilePath, settings)
' Read the document...
Dim errorsText As String = errorBuilder.GetErrors()
If errorsText IsNot Nothing Then
' Handle the errors
End If
End Function
另外,您还可以使用新的XDocument
类。使用XDocument
的方式与XmlDocument
非常相似。对XDocument
有一个Validate
扩展方法,它再次需要一个ValidationEventHandler
委托。这里有一个例子:
Public Function LoadValidatedXDocument(xmlFilePath As String, xsdFilePath As String) As XDocument
Dim doc As XDocument = XDocument.Load(xmlFilePath)
Dim schemas As New XmlSchemaSet()
schemas.Add(Nothing, xsdFilePath)
Dim errorBuilder As New XmlValidationErrorBuilder()
doc.Validate(schemas, New ValidationEventHandler(AddressOf errorBuilder.ValidationEventHandler))
Dim errorsText As String = errorBuilder.GetErrors()
If errorsText IsNot Nothing Then
Throw New Exception(errorsText)
End If
Return doc
End Function
至于从XML文档中的数据加载到数据库中,这是很难说如何,确切的说,要做到这一点不知道XML文档的架构,的架构数据库,数据库的种类等。我建议在读取XML数据和将数据写入数据库时进行一些研究,看看你能得到多少。如果遇到任何具体问题,我们将在此处帮助:)
非常感谢Steven Doggart! – user565992
Steven Doggart-我用你的代码如上所述,不幸的是我遇到了一个问题,请参阅http://*.com/questions/33393364/vb-net-xsd-validation-repeating-validation-error-after-dealing-与-AN-无效 – Lynchie
可能的重复[如何在VB.net中针对Schema验证XML](http://*.com/questions/) 15088585/how-to-validate-xml-against-schema-in-vb-net) –