この記事では、 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 ドキュメントを作成する
Microsoft Visual Studio 2005 または Microsoft Visual Studio .NET を起動します。 次に、新しい XML ファイルを作成します ([ファイル] メニューの [ New] をポイントし、[ファイル] をクリックします)。
XML ファイルの種類を選択し、[ 開く] をクリックします。
カタログ内の製品を表す次のデータを XML ドキュメントに追加します。
<Product ProductID="123"> <ProductName>Rugby jersey</ProductName> </Product>
後ですぐにアクセスできるフォルダーに Product.xml としてファイルを保存します (この記事のコード サンプルでは、
C:\MyFolder
という名前のフォルダーを想定しています)。
DTD を作成し、XML ドキュメントにリンクする
Visual Studio 2005 または Visual Studio .NET で、[ファイル] メニューの [新規作成] をポイントし、[ファイル] をクリックします。
[テキスト ファイルの種類] を選択し、[開く ] をクリック。
XML ドキュメントの文法を記述するために、次の DTD 宣言をファイルに追加します。
<!ELEMENT Product (ProductName)> <!ATTLIST Product ProductID CDATA #REQUIRED> <!ELEMENT ProductName (#PCDATA)>
XML ドキュメントと同じフォルダー Product.dtd としてファイルを保存します。
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">
変更した XML ドキュメントを ProductWithDTD.xmlとして保存します。
DTD を使用して検証を実行する
Visual Studio 2005 または Visual Studio .NET で、 ValidateXmlUsingVB という名前の新しい Visual Basic コンソール アプリケーション プロジェクトを作成します。
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)
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
Main サブルーチンで、XmlTextReader オブジェクトを作成して、テキスト ファイルから XML ドキュメントを読み取ります。 次に、
XmlValidatingReader
オブジェクトを作成して、この XML データを検証します。Dim r As New XmlTextReader("C:\MyFolder\ProductWithDTD.xml") Dim v As New XmlValidatingReader(r)
XmlValidatingReader オブジェクトには、必要な検証の種類 (DTD、XDR、またはスキーマ) を示す ValidationType プロパティがあります。 次のように、このプロパティを DTD に設定します。
v.ValidationType = ValidationType.DTD
検証エラーが発生した場合、検証リーダーは検証イベントを生成します。 検証イベント ハンドラーを登録する次のコードを追加します (このセクションの手順 8 で MyValidationEventHandler サブルーチンを実装します)。
AddHandler v.ValidationEventHandler, AddressOf MyValidationEventHandler
XML ドキュメントの読み取りと検証を行う次のコードを追加します。 検証エラーが発生した場合、エラーを処理するために MyValidationEventHandler が呼び出されます。 このサブルーチンは、
isValid
を False に設定します (このセクションの手順 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
Main サブルーチンの後に、次のように MyValidationEventHandler サブルーチンを記述します。
Public Sub MyValidationEventHandler(ByVal sender As Object, _ ByVal args As ValidationEventArgs) isValid = False Console.WriteLine("Validation event" & vbCrLf & args.Message) End Sub
アプリケーションをビルドして実行します。
アプリケーションは、XML ドキュメントが有効であることを報告する必要があります。 10. Visual Studio 2005 または Visual Studio .NET で、ProductWithDTD.xmlを変更して無効にします (たとえば、 ProductName Rugby jersey/ ProductName 要素を削除します)。 11. アプリケーションをもう一度実行します。
アプリケーションに次のエラー メッセージが表示されます。
検証イベント要素 'Product' に不完全なコンテンツがあります。 'ProductName' が必要です。 file:///C:/MyFolder/ProductWithDTD.xml(4, 3) でエラーが発生しました。 ドキュメントが無効です
XDR スキーマを作成し、XML ドキュメントにリンクする
Visual Studio 2005 または Visual Studio .NET で、[ファイル] メニューの [新規作成] をポイントし、[ファイル] をクリックします。
[テキスト ファイルの種類] を選択し、[開く ] をクリック。
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>
XML ドキュメントと同じフォルダーにファイルを Product.xdr として保存します。
元の Product.xmlをもう一度開き、次のように XDR スキーマにリンクします。
<?xml version="1.0" encoding="utf-8" ?> <Product ProductID="123" xmlns="x-schema:Product.xdr"> <ProductName>Rugby jersey</ProductName> </Product>
変更した XML ドキュメントを ProductWithXDR.xmlとして保存します。
XDR スキーマを使用して検証を実行する
次のように、XmlTextReader が ProductWithXDR.xml読み込まれるようにアプリケーションを変更します。
Dim r As New XmlTextReader("C:\MyFolder\ProductWithXDR.xml")
次のように、検証リーダーが XDR 検証を実行するように、
ValidationType
を XDR に設定します。v.ValidationType = ValidationType.XDR
アプリケーションをビルドして実行します。
アプリケーションは、XML ドキュメントが有効であることを報告する必要があります。
ProductWithXDR.xmlを変更して、意図的に無効にします。
アプリケーションをもう一度実行する
アプリケーションは検証エラーを報告する必要があります。
XSD スキーマを作成し、XML ドキュメントにリンクする
Visual Studio .NET で、[ファイル] メニューの [新規作成] をポイントし、[ファイル] をクリックします。
[テキスト ファイルの種類] を選択し、[開く ] をクリック。
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>
XML ドキュメントと同じフォルダーに Product.xsd としてファイルを保存します。
元の 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>
変更した XML ドキュメントを ProductWithXSD.xmlとして保存します。
XSD スキーマを使用して検証を実行する
次のように、
XmlTextReader
が ProductWithXSD.xml読み込まれるようにアプリケーションを変更します。Dim r As New XmlTextReader("C:\MyFolder\ProductWithXSD.xml")
次のように、検証リーダーが XSD スキーマ検証を実行するように、
ValidationType
を Schema に設定します。v.ValidationType = ValidationType.Schema
XSD スキーマを使用して XML ドキュメントを検証するアプリケーションをビルドして実行します。
アプリケーションは、XML ドキュメントが有効であることを報告する必要があります。
XSD スキーマで名前空間を使用する
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>
ProductWithXSD.xml保存します。
Product.xsd を開き、[XML] タブをクリックし、次のように xsd:schema 開始タグを変更して、スキーマが名前空間
urn:MyNamespace
に適用されるようにします。<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:MyNamespace" elementFormDefault="qualified">
Product.xsd を保存します。
XSD スキーマを使用して XML ドキュメントを検証するアプリケーションを実行します。
名前空間をキャッシュする
Visual Studio 2005 または Visual Studio .NET で、Module1.vbを開きます。 Main サブルーチンの開始時に、次のように
XmlSchemaCollection
オブジェクトを作成します。Dim cache As New XmlSchemaCollection()
XmlSchemaCollection
オブジェクトを使用すると、パフォーマンスを向上させるためにスキーマをメモリにキャッシュできます。 各スキーマは、異なる名前空間に関連付けられています。 次のコードを追加して、 Product.xsd をキャッシュします。cache.Add("urn:MyNamespace", "C:\MyFolder\Product.xsd")
XmlValidatingReader
オブジェクトを作成するコードの後に、次のステートメントを追加します。 これにより、リーダーがメモリ内スキーマを使用できるように、スキーマ キャッシュがXmlValidatingReader
に追加されます。v.Schemas.Add(cache)
検証
- アプリケーションをビルドして実行します。
- XML ドキュメントが XSD スキーマに対してまだ検証されていることを確認します。
- 意図的に無効にするために、 ProductWithXSD.xml にいくつかの変更を加えます。
- アプリケーションがこれらの検証エラーを検出することを確認します。