Có, bạn đang đi đúng hướng. Việc xác thực tài liệu XML có thể được thực hiện bằng cách sử dụng XmlDocument
hoặc XmlReader
(như tôi sẽ mô tả sau, bạn cũng có thể sử dụng XDocument
). Cái nào bạn chọn sẽ tùy thuộc vào tình huống của bạn, nhưng cả hai đều hoạt động tương tự. Khi họ tìm thấy lỗi với tài liệu, họ gọi số đại biểu là ValidationEventHandler
. Các XmlReader
gọi nó thông qua một sự kiện trong các đối tượng XmlReaderSettings
trong khi các XmlDocument
gọi nó thông qua một đại biểu thông qua như một tham số để phương pháp Validate
của nó. Dưới đây là một lớp đơn giản mà có thể được sử dụng để thu thập các lỗi:
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
Phương pháp ValidationEventHandler
trong lớp đó phù hợp với chữ ký của người ValidationEventHandler
đại biểu, vì vậy bạn có thể sử dụng nó để thu thập các lỗi từ một trong hai XmlReader
hoặc XmlDocument
. Đây là cách bạn có thể sử dụng nó với 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
Và đây là cách bạn có thể sử dụng nó với các 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
Ngoài ra, bạn cũng có thể sử dụng XDocument
lớp mới. Cách thực hiện với XDocument
rất giống với XmlDocument
. Có một phương pháp mở rộng Validate
cho số XDocument
mất, nhưng một lần nữa, một đại biểu ValidationEventHandler
. Dưới đây là một ví dụ về điều đó:
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
Đối với tải dữ liệu từ các tài liệu XML thành một cơ sở dữ liệu, nó không thể nói như thế nào, chính xác, để làm điều đó mà không biết giản đồ của các tài liệu XML, lược đồ của cơ sở dữ liệu, loại cơ sở dữ liệu, vv Tôi khuyên bạn nên làm một số nghiên cứu cả về đọc dữ liệu XML và ghi dữ liệu vào cơ sở dữ liệu và xem bạn nhận được bao xa. Nếu bạn có bất kỳ câu hỏi cụ thể nào khi gặp sự cố, chúng tôi sẽ sẵn sàng trợ giúp :)
bản sao có thể có của [Cách xác thực XML chống lại Lược đồ trong VB.net] (http://stackoverflow.com/questions/ 15088585/how-to-validate-xml-against-schema-in-vb-net) –