Visual C# .NET で DTD、XDR、または XSD を使用して XML ドキュメントを検証する方法

概要

この資料では、ドキュメント型定義 (DTD)、Microsoft XML-Data Reduced (XDR) スキーマ、または XML スキーマ定義言語 (XSD) スキーマを XML (Extensible Markup Language) ドキュメントに適用する方法を紹介します。また、XmlValidatingReader クラスを使用して XML ドキュメントを指定された文法に照らして検証する方法、および XML の検証を最適化するために XmlSchemaCollection クラスを使用してスキーマをメモリにキャッシュする方法についても説明します。



XML ドキュメントには、要素と属性が含まれています。これらは、アプリケーションと組織の間でデータを交換するための柔軟で強力な手段を提供するものです。使用可能な XML ドキュメントの構造と内容を指定するには、DTD、XDR スキーマ、または XSD スキーマを記述します。Microsoft .NET Framework で XML の文法を指定する方法としては XSD スキーマが推奨されていますが、DTD および XDR スキーマもサポートされています。



必要条件

この資料は、以下のトピックについて詳しい知識のあるユーザーを対象としています。

  • Microsoft Visual C# .NET または Microsoft Visual Basic .NET の構文
  • XML の概念 (検証に関する知識を含む)

XML ドキュメントの作成

  1. Visual Studio .NET を起動します。

  2. ローカル コンピュータ上に新しい XML ファイルを作成します。

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

    <Product ProductID="123">
    <ProductName>Rugby jersey</ProductName>
    </Product>
  4. C:\MyFolder という名前で作成した新しいフォルダの中に、このファイルを Product.xml という名前で保存します。

DTD を使用した検証

DTD の作成と XML ドキュメントへのリンク

  1. Visual Studio .NET で、空のテキスト ファイルを作成します。

  2. このファイルに、XML ドキュメントの文法を記述した以下のような DTD 宣言を入力します。

    <!ELEMENT Product (ProductName)>
    <!ATTLIST Product ProductID CDATA #REQUIRED>
    <!ELEMENT ProductName (#PCDATA)>
  3. このファイルを C:\MyFolder ディレクトリに Product.dtd という名前で保存します。

  4. Visual Studio .NET で Product.xml を開きます。

  5. Product.xml の先頭に次の DOCTYPE ステートメントを追加して、XML ドキュメントを DTD ファイルにリンクします。

    <?xml version="1.0"?>
    <!DOCTYPE Product SYSTEM "Product.dtd">
  6. 変更後の XML ドキュメントを ProductWithDTD.xml という名前で保存します。

DTD を使用した XML ドキュメントの検証

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

  2. Class1.cs の先頭に次の 2 つの using ステートメントを追加します。

    using System.Xml;        // for XmlTextReader and XmlValidatingReader
    using System.Xml.Schema; // for XmlSchemaCollection (which is used later)
  3. Class1.cs で、Main メソッドを開始する前に isValid という名前のブール型変数を宣言します。

    private static bool isValid = true;      // If a validation error occurs,
    // set this flag to false in the
    // validation event handler.
  4. Main メソッドの中でテキスト ファイルから XML ドキュメントを読み取るための XmlTextReader オブジェクトを作成した後、この XML データを検証する XmlValidatingReader を作成します。

    XmlTextReader r = new XmlTextReader("C:\\MyFolder\\ProductWithDTD.xml");
    XmlValidatingReader v = new XmlValidatingReader(r);
  5. XmlValidatingReader オブジェクトの ValidationType プロパティは、必要な検証の種類 (DTD、XDR、または Schema) を表します。このプロパティを DTD に設定します。

    v.ValidationType = ValidationType.DTD;
  6. 検証エラーが発生した場合、検証リーダーにより検証イベントが生成されます。次のコードを追加して、検証イベント ハンドラを登録します (MyValidationEventHandler メソッドは手順 8. で実装します)。

    v.ValidationEventHandler += 
    new ValidationEventHandler(MyValidationEventHandler);
  7. 次のコードを追加して、XML ドキュメントの読み取りと検証を実行します。検証エラーが発生すると、MyValidationEventHandler がエラーに対処するために呼び出されます。このメソッドにより、isValid が False に設定されます (手順 8. 参照)。検証後に isValid のステータスをチェックして、ドキュメントが有効か無効かを調べることができます。

    while (v.Read())
    {
    // Can add code here to process the content.
    }
    v.Close();

    // Check whether the document is valid or invalid.
    if (isValid)
    Console.WriteLine("Document is valid");
    else
    Console.WriteLine("Document is invalid");
  8. Main メソッドの後に MyValidationEventHandler メソッドを記述します。

    public static void MyValidationEventHandler(object sender, 
    ValidationEventArgs args)
    {
    isValid = false;
    Console.WriteLine("Validation event\n" + args.Message);
    }
  9. アプリケーションをビルドし、実行します。XML ドキュメントは有効であると報告されます。

  10. Visual Studio .NET で、ProductWithDTD.xml を無効になるように変更します (たとえば、"<ProductName>Rugby jersey</ProductName>" 要素を削除します)。

  11. 再びアプリケーションを実行します。次のようなエラー メッセージが表示されます。

    Validation event

    要素 'Product' には無効な内容が含まれています。'ProductName' を指定してください。


    file:///C:/MyFolder/ProductWithDTD.xml(4, 5) でエラーが発生しました。


    Document is invalid

XDR スキーマを使用した検証

XDR スキーマの作成と XML ドキュメントへのリンク

  1. Visual Studio .NET で、空のテキスト ファイルを作成します。

  2. このファイルに、XML ドキュメントの文法を記述した以下のような XDR スキーマ定義を入力します。

    <?xml version="1.0"?>
    <Schema name="ProductSchema"
    xmlns="urn:schemas-microsoft-com:xml-data"
    xmlns:dt="urn:schemas-microsoft-com:datatypes">

    <ElementType name="Product" content="eltOnly">
    <attribute type="ProductID" required="yes"/>
    <element type="ProductName"/>
    </ElementType>

    <AttributeType name="ProductID" dt:type="int"/>
    <ElementType name="ProductName" dt:type="string"/>
    </Schema>
  3. このファイルを C:\MyFolder ディレクトリに Product.xdr という名前で保存します。

  4. 元の Product.xml ファイルを開き、XDR スキーマにリンクします。

    <?xml version="1.0"?>
    <Product ProductID="123" xmlns="x-schema:Product.xdr">
    <ProductName>Rugby jersey</ProductName>
    </Product>
  5. 変更後の XML ドキュメントを ProductWithXDR.xml という名前で保存します。

XDR スキーマを使用した XML ドキュメントの検証

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

    XmlTextReader r = new XmlTextReader("C:\\MyFolder\\ProductWithXDR.xml");
  2. ValidationType を XDR に設定し、検証リーダーによって XDR による検証が実行されるようにします。

    v.ValidationType = ValidationType.XDR;
  3. アプリケーションをビルドし、実行します。XML ドキュメントは有効であると報告されます。

  4. ProductWithXDR.xml を変更し、XML ドキュメントが無効になるようにします。

  5. 再びアプリケーションをビルドし、実行します。検証エラーが表示されます。

XSD スキーマを使用した検証

XSD スキーマの作成と XML ドキュメントへのリンク

  1. Visual Studio .NET で、空のテキスト ファイルを作成します。

  2. このファイルに、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>
  3. このファイルを C:\MyFolder ディレクトリに Product.xsd という名前で保存します。

  4. 元の Product.xml ファイルを開き、XSD スキーマにリンクします。

    <?xml version="1.0"?>
    <Product ProductID="123"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="Product.xsd">
    <ProductName>Rugby jersey</ProductName>
    </Product>
  5. 変更後の XML ドキュメントを ProductWithXSD.xml という名前で保存します。

XSD スキーマを使用した XML ドキュメントの検証

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

    XmlTextReader r = new XmlTextReader("C:\\MyFolder\\ProductWithXSD.xml");
  2. ValidationType を Schema に設定し、検証リーダーによって XSD スキーマによる検証が実行されるようにします。

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

XSD スキーマでの名前空間の使用

  1. Visual Studio .NET で、ProductWithXSD.xml を開きます。

  2. ドキュメント内で、デフォルトの名前空間 urn:MyNamespace を宣言します。さらに、XSD リンクを変更して、XSD スキーマによってこの名前空間の内容が検証されるようにします。

    <?xml version="1.0"?>
    <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>
  3. ProductWithXSD.xml への変更を保存します。

  4. Product.xsd を開きます。<xsd:schema> 開始タグを次のように変更し、スキーマが名前空間 urn:MyNamespace に適用されるようにします。

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

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

名前空間のキャッシュ

  1. Visual Studio .NET で、Class1.cs を開きます。Main メソッドの開始時に、次のように XmlSchemaCollection オブジェクトを作成します。

    XmlSchemaCollection cache = 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 を変更し、XML ドキュメントが無効になるようにします。

  4. 上記の検証エラーが検出されることを確認します。

プロパティ

文書番号:307379 - 最終更新日: 2008/04/29 - リビジョン: 1

フィードバック