2013-08-27 38 views
5

Tôi cần làm gì? Tôi cần xác thực tệp XML (chuyển đường dẫn tệp/vị trí) đối với tệp XSD (chuyển đường dẫn tệp/vị trí). Tôi cần phải kiểm tra xem nó có được cải thiện không có các ký tự không hợp lệ và nó có tất cả các thẻ được định nghĩa trong XSD nghĩa là không có thẻ nào bị thiếu. Nó khớp với các kiểu dữ liệu được định nghĩa trong xsd. Sau đó, tôi cần phân tích cú pháp tệp xml để lấy dữ liệu và lưu trữ nó trong cơ sở dữ liệu.VB.NET xác thực tệp XML dựa vào tệp XSD và phân tích cú pháp qua xml

Câu hỏi? 1) Sử dụng XmlReaderSetttings với XmlDocument và XmlReader với phương pháp xác thực sẽ giúp tôi đạt được những gì tôi cần? Bất cứ ai giúp tôi với mã sampel?

2) Cách tốt nhất để phân tích cú pháp tệp xml để nhận thẻ cụ thể là gì?

Tôi mới dùng VB.net vì vậy mọi trợ giúp về mã mẫu sẽ được đánh giá cao. Cảm ơn!

+0

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) –

Trả lời

6

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 :)

+0

Cảm ơn bạn rất nhiều Steven Doggart! – user565992

+0

Steven Doggart- Tôi đã sử dụng mã của bạn như trên và rất tiếc là tôi đã gặp phải vấn đề, vui lòng xem http://stackoverflow.com/questions/33393364/vb-net-xsd-validation-repeating-validation-error-after-dealing- không hợp lệ – Lynchie

Các vấn đề liên quan