2013-08-27 21 views
5

何をする必要がありますか? XSDファイル(ファイルパス/場所を渡す)に対してXMLファイル(ファイルパス/場所を渡す)を検証する必要があります。私はそれが不正な文字ではないことを確認し、XSDで定義されたすべてのタグ、すなわちタグがないことを確認する必要があります。これは、xsdで定義されたデータ型と一致します。それが完了したら、XMLファイルを解析してデータを取得し、データベースに格納する必要があります。VB.NETはXSDファイルに対してXMLファイルを検証し、xmlを解析します

お困りですか? 1)XmlDocumentでXmlReaderSettingsを、ValidateメソッドでXmlReaderを使用すると、必要なものを手に入れることができますか?いずれにせよサンプルコードで助けてくれますか?

2)XMLファイルを解析して特定のタグを取得するには、どのような方法が最適ですか?

私はVB.netを初めて使用していますので、サンプルコードのヘルプは高く評価されます。ありがとう!

+0

[VB.netのスキーマに対してXMLを検証する方法](http://stackoverflow.com/questions/) 15088585/how-to-validate-xml-against-vb-net) –

答えて

6

はい、あなたは正しい方向にあります。 XmlDocumentまたはXmlReaderのいずれかを使用してXML文書の検証を行うことができます(後で説明しますが、XDocumentも使用できます)。どちらを選択するかは状況によって異なりますが、どちらも同じように機能します。ドキュメントでエラーが見つかると、ValidationEventHandler代理人を呼び出します。 XmlReaderは​​オブジェクトのイベントを介して呼び出されますが、XmlDocumentValidateメソッドのパラメータとして渡されたデリゲートを介して呼び出されます。ここでは、エラーを収集するために使用することができる単純なクラスです。このクラスで

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

ありがとう、スティーブン・ドッグガート! – user565992

+0

スティーブンドッグガート - 私は上記のようにあなたのコードを使用し、残念ながら私は問題を遭遇してくださいhttp://stackoverflow.com/questions/33393364/vb-net-xsd-validation-repeating-validation-error-after-dealing-無効な – Lynchie

関連する問題