Visual Basic で DTD、XDR、または XSD を使用して XML ドキュメントを検証する

この記事では、 クラスを XmlValidatingReader 使用して、Visual Basic 2005 または Visual Basic .NET の DTD、XDR スキーマ、または XSD スキーマに対して XML ドキュメントを検証する方法について説明します。 また、スキーマをキャッシュして検証を最適化する方法についても説明します。

元の製品バージョン: Visual Basic
元の KB 番号: 315533

概要

拡張マークアップ言語 (XML) ドキュメントには要素と属性が含まれており、アプリケーションと組織の間でデータを柔軟かつ強力に交換する方法が提供されます。 XML ドキュメントの許容される構造と内容を指定するには、ドキュメント型定義 (DTD)、Microsoft XML-Data Reduced (XDR) スキーマ、または XML スキーマ定義言語 (XSD) スキーマを記述します。

XSD スキーマは、.NET Frameworkで XML 文法を指定する推奨される方法ですが、DTD と XDR スキーマもサポートされています。

この記事では、MICROSOFT Visual Basic 2005 または Microsoft Visual Basic .NET の XML ドキュメントに DTD、XDR スキーマ、または XSD スキーマを適用する方法について説明します。 次に、XmlValidatingReader クラスを使用して、指定した文法に対して XML ドキュメントを検証する方法について説明します。 XML 検証を最適化する方法として、XmlSchemaCollection クラスを使用してメモリ内のスキーマをキャッシュする方法についても説明します。

要件

次の一覧は、必要なハードウェア、ソフトウェア、ネットワーク インフラストラクチャ、およびサービス パックの概要を示しています。Microsoft Visual Basic 2005 または Microsoft Visual Basic .NET

この記事では、次の Microsoft .NET Framework クラス ライブラリ名前空間について説明します。

  • System.Xml
  • System.Xml.Schema

この記事では、次のトピックについて理解していることを前提としています。

  • Visual Basic 2005 または Visual Basic .NET 構文
  • 検証の問題を含む XML の概念

XML ドキュメントを作成する

  1. Microsoft Visual Studio 2005 または Microsoft Visual Studio .NET を起動します。 次に、新しい XML ファイルを作成します ([ファイル] メニューの [ 新規] をポイントし、[ファイル] をクリックします)。

  2. [XML ファイルの種類] を選択し、[ 開く] をクリックします。

  3. 次のデータを XML ドキュメントに追加して、カタログ内の製品を表します。

    <Product ProductID="123">
        <ProductName>Rugby jersey</ProductName>
    </Product>
    
  4. 後ですぐにアクセスできるフォルダーに Product.xml ファイルを保存します (この記事のコード サンプルでは、 という名前 C:\MyFolderのフォルダーを想定しています)。

  1. Visual Studio 2005 または Visual Studio .NET で、[ファイル] メニューの [新規作成] をポイントし、[ファイル] をクリックします。

  2. [テキスト ファイルの種類] を選択し、[ 開く] をクリックします。

  3. XML ドキュメントの文法を記述するために、次の DTD 宣言をファイルに追加します。

    <!ELEMENT Product (ProductName)>
    <!ATTLIST Product ProductID CDATA #REQUIRED>
    <!ELEMENT ProductName (#PCDATA)>
    
  4. ファイルを Product.dtd として XML ドキュメントと同じフォルダーに保存します。

  5. Visual Studio 2005 または Visual Studio .NET でProduct.xmlをもう一度開きます。これを行うには、[ファイル] メニューの [開く] をポイントし、[ファイル] をクリックします。 次のように DOCTYPE ステートメント (行の ?xml version="1.0" 下) を追加します。 これにより、XML ドキュメントが DTD ファイルにリンクされます)。

    <?xml version="1.0" encoding="utf-8" ?>
    <!DOCTYPE Product SYSTEM "Product.dtd">
    
  6. 変更した XML ドキュメントを ProductWithDTD.xmlとして保存します。

DTD を使用して検証を実行する

  1. Visual Studio 2005 または Visual Studio .NET で、 ValidateXmlUsingVB という名前の新しい Visual Basic コンソール アプリケーション プロジェクトを作成します。

  2. Visual Studio 2005 または Visual Studio .NET には 、Module1.vbという名前の新しいファイルが表示されます。 このファイルの先頭に、次のように 2 つの Imports ステートメントを追加します。

    Imports System.Xml ' For XmlTextReader and XmlValidatingReader
    Imports System.Xml.Schema ' For XmlSchemaCollection (used later)
    
  3. Module1 (Main サブルーチンの開始前) で、isValid という名前のブール変数を次のように宣言します。

    'If a validation error occurs,
    ' you will set this flag to False 
    ' in the validation event handler. 
    Private isValid As Boolean = True
    
  4. Main サブルーチンで XmlTextReader オブジェクトを作成し、テキスト ファイルから XML ドキュメントを読み取ります。 次に、この XML データを XmlValidatingReader 検証するオブジェクトを作成します。

    Dim r As New XmlTextReader("C:\MyFolder\ProductWithDTD.xml")
    Dim v As New XmlValidatingReader(r)
    
  5. XmlValidatingReader オブジェクトには、必要な検証の種類 (DTD、XDR、またはスキーマ) を示す ValidationType プロパティがあります。 次のように、このプロパティを DTD に設定します。

    v.ValidationType = ValidationType.DTD
    
  6. 検証エラーが発生した場合、検証リーダーは検証イベントを生成します。 次のコードを追加して、検証イベント ハンドラーを登録します (このセクションの手順 8 で MyValidationEventHandler サブルーチンを実装します)。

    AddHandler v.ValidationEventHandler, AddressOf MyValidationEventHandler
    
  7. 次のコードを追加して、XML ドキュメントの読み取りと検証を行います。 検証エラーが発生した場合、エラーを処理するために MyValidationEventHandler が呼び出されます。 このサブルーチンは False に設定isValidされます (このセクションの手順 8 を参照)。 検証後に isValid の状態をチェックして、ドキュメントが有効か無効かを確認できます。

    While v.Read()' Could add code here to process the content.
    End While
    v.Close()' Check whether the document is valid or invalid.
    If isValid Then
        Console.WriteLine("Document is valid")
    Else
        Console.WriteLine("Document is invalid")
    End If
    
  8. Main サブルーチンの後に、MyValidationEventHandler サブルーチンを次のように記述します。

    Public Sub MyValidationEventHandler(ByVal sender As Object, _
     ByVal args As ValidationEventArgs)
         isValid = False
         Console.WriteLine("Validation event" & vbCrLf & args.Message)
    End Sub
    
  9. アプリケーションをビルドして実行します。

アプリケーションは、XML ドキュメントが有効であることを報告する必要があります。 10. Visual Studio 2005 または Visual Studio .NET で、ProductWithDTD.xml を変更して無効にします (たとえば、 ProductName Rugby jersey/ ProductName 要素を削除します)。 11. アプリケーションをもう一度実行します。

アプリケーションに次のエラー メッセージが表示されます。

検証イベント要素 'Product' には不完全な内容があります。 "ProductName" が必要です。 file:///C:/MyFolder/ProductWithDTD.xml(4, 3) でエラーが発生しました。 ドキュメントが無効です

  1. Visual Studio 2005 または Visual Studio .NET で、[ファイル] メニューの [新規作成] をポイントし、[ファイル] をクリックします。

  2. [テキスト ファイルの種類] を選択し、[ 開く] をクリックします。

  3. XML ドキュメントの文法を記述するために、次の XDR スキーマ定義をファイルに追加します。

    <?xml version="1.0"?>
    <Schema name="ProductSchema" 
     xmlns="urn:schemas-microsoft-com:xml-data"
     xmlns:dt="urn:schemas-microsoft-com:datatypes">
    
        <AttributeType name="ProductID" dt:type="int"/>
        <ElementType name="ProductName" dt:type="string"/>
    
        <ElementType name="Product" content="eltOnly">
            <attribute type="ProductID" required="yes"/>
            <element type="ProductName"/>
        </ElementType>
    </Schema>
    
  4. ファイルを Product.xdr として XML ドキュメントと同じフォルダーに保存します。

  5. 元の Product.xmlをもう一度開き、次のように XDR スキーマにリンクします。

    <?xml version="1.0" encoding="utf-8" ?>
    <Product ProductID="123" xmlns="x-schema:Product.xdr"> 
        <ProductName>Rugby jersey</ProductName>
    </Product>
    
  6. 変更した XML ドキュメントを ProductWithXDR.xmlとして保存します。

XDR スキーマを使用して検証を実行する

  1. 次のように、XmlTextReader が ProductWithXDR.xml読み込まれるようにアプリケーションを変更します。

    Dim r As New XmlTextReader("C:\MyFolder\ProductWithXDR.xml")
    
  2. 検証リーダーが ValidationType XDR 検証を実行するように、 を XDR に設定します。

    v.ValidationType = ValidationType.XDR
    
  3. アプリケーションをビルドして実行します。

    アプリケーションは、XML ドキュメントが有効であることを報告する必要があります。

  4. ProductWithXDR.xml を変更して、意図的に無効にします。

  5. アプリケーションをもう一度実行します。

    アプリケーションは検証エラーを報告する必要があります。

  1. Visual Studio .NET で、[ファイル] メニューの [新規作成] をポイントし、[ファイル] をクリックします。

  2. [テキスト ファイルの種類] を選択し、[ 開く] をクリックします。

  3. XML ドキュメントの文法を記述するために、次の XSD スキーマ定義をファイルに追加します。

    <?xml version="1.0"?>
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <xsd:element name="Product">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="ProductName" type="xsd:string"/>
            </xsd:sequence>
            <xsd:attribute name="ProductID" use="required" type="xsd:int"/>
        </xsd:complexType>
        </xsd:element>
    </xsd:schema>
    
  4. ファイルを Product.xsd として XML ドキュメントと同じフォルダーに保存します。

  5. 元の Product.xmlをもう一度開き、次のように XSD スキーマにリンクします。

    <?xml version="1.0" encoding="utf-8" ?>
    <Product ProductID="123" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:noNamespaceSchemaLocation="Product.xsd">
        <ProductName>Rugby jersey</ProductName>
    </Product>
    
  6. 変更した XML ドキュメントを ProductWithXSD.xmlとして保存します。

XSD スキーマを使用して検証を実行する

  1. 次のように、読み込みが ProductWithXSD.xmlするようにXmlTextReaderアプリケーションを変更します。

    Dim r As New XmlTextReader("C:\MyFolder\ProductWithXSD.xml")
    
  2. ValidationType検証リーダーが XSD スキーマの検証を実行するように、 を [スキーマ] に設定します。

    v.ValidationType = ValidationType.Schema
    
  3. XSD スキーマを使用して XML ドキュメントを検証するアプリケーションをビルドして実行します。

    アプリケーションは、XML ドキュメントが有効であることを報告する必要があります。

XSD スキーマで名前空間を使用する

  1. Visual Studio 2005 または Visual Studio .NET で、 ProductWithXSD.xmlを開きます。 ドキュメントで既定の名前空間 urn:MyNamespaceを宣言します。 次のように、XSD リンケージを変更して、この名前空間のコンテンツを検証する XSD スキーマを指定します。

    <?xml version="1.0" encoding="utf-8"?>
    <Product ProductID="123" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns="urn:MyNamespace"
     xsi:schemaLocation="urn:MyNamespace Product.xsd">
        <ProductName>Rugby jersey</ProductName>
    </Product>
    
  2. ProductWithXSD.xml保存します。

  3. Product.xsd を開き、[XML] タブをクリックし、 xsd:schema start タグを次のように変更して、スキーマが名前空間 urn:MyNamespaceに適用されるようにします。

    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
     targetNamespace="urn:MyNamespace"
     elementFormDefault="qualified">
    
  4. Product.xsd を保存します。

  5. XSD スキーマを使用して XML ドキュメントを検証するには、アプリケーションを実行します。

名前空間をキャッシュする

  1. Visual Studio 2005 または Visual Studio .NET で、Module1.vbを開きます。 Main サブルーチンの開始時に、次のようにオブジェクトを XmlSchemaCollection 作成します。

    Dim cache As New XmlSchemaCollection()
    
  2. XmlSchemaCollectionオブジェクトを使用すると、パフォーマンスを向上させるために、メモリ内のスキーマをキャッシュできます。 各スキーマは、異なる名前空間に関連付けられています。 Product.xsd をキャッシュする次のコードを追加します。

    cache.Add("urn:MyNamespace", "C:\MyFolder\Product.xsd")
    
  3. オブジェクトを作成するコードの後に XmlValidatingReader 、次のステートメントを追加します。 これにより、リーダーがメモリ内スキーマを XmlValidatingReader 使用できるように、スキーマ キャッシュが に追加されます。

    v.Schemas.Add(cache)
    

検証

  1. アプリケーションをビルドして実行します。
  2. XML ドキュメントが XSD スキーマに対してまだ検証されていることを確認します。
  3. 意図的に無効にするために 、ProductWithXSD.xml にいくつかの変更を加えます。
  4. アプリケーションがこれらの検証エラーを検出したことを確認します。