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的新手,所以任何示例代码的帮助将不胜感激。谢谢!

+0

可能的重复[如何在VB.net中针对Schema验证XML](http://*.com/questions/) 15088585/how-to-validate-xml-against-schema-in-vb-net) –

是的,你是在正确的轨道上。验证XML文档可以使用XmlDocumentXmlReader(我将在后面描述,也可以使用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数据和将数据写入数据库时​​进行一些研究,看看你能得到多少。如果遇到任何具体问题,我们将在此处帮助:)

+0

非常感谢Steven Doggart! – user565992

+0

Steven Doggart-我用你的代码如上所述,不幸的是我遇到了一个问题,请参阅http://*.com/questions/33393364/vb-net-xsd-validation-repeating-validation-error-after-dealing-与-AN-无效 – Lynchie