次の方法で共有


スキーマ コンパイル用の XmlSchemaSet

XML スキーマ定義言語 (XSD) スキーマを格納および検証できるキャッシュである XmlSchemaSetについて説明します。

XmlSchemaSet クラス

XmlSchemaSetは、XML スキーマ定義言語 (XSD) スキーマを格納および検証できるキャッシュです。

System.Xml バージョン 1.0 では、XML スキーマがスキーマのライブラリとしてXmlSchemaCollection クラスに読み込まれました。 System.Xml バージョン 2.0 では、XmlValidatingReaderクラスとXmlSchemaCollection クラスは廃止され、それぞれ Create メソッドと XmlSchemaSet クラスに置き換えられました。

XmlSchemaSetは、標準の互換性、パフォーマンス、古い Microsoft XML-Data Reduced (XDR) スキーマ形式など、さまざまな問題を修正するために導入されました。

XmlSchemaCollection クラスと XmlSchemaSet クラスの比較を次に示します。

XmlSchemaCollection XmlSchemaSet
Microsoft XDR および W3C XML スキーマをサポートします。 W3C XML スキーマのみをサポートします。
スキーマは、 Add メソッドが呼び出されたときにコンパイルされます。 スキーマは、 Add メソッドが呼び出されたときにコンパイルされません。 これにより、スキーマ ライブラリの作成時にパフォーマンスが向上します。
各スキーマは、"スキーマ アイランド" になる可能性がある個別のコンパイル済みバージョンを生成します。その結果、すべてのインクルードとインポートは、そのスキーマ内でのみスコープされます。 コンパイルされたスキーマでは、1 つの論理スキーマ (スキーマの "セット") が生成されます。 セットに追加されたスキーマ内でインポートされたスキーマはすべて、セット自体に直接追加されます。 つまり、すべての型をすべてのスキーマで使用できます。
コレクション内に存在できるのは、特定のターゲット名前空間のスキーマが 1 つだけです。 型の競合がない限り、同じターゲット名前空間の複数のスキーマを追加できます。

XmlSchemaSet への移行

次のコード例では、古い XmlSchemaCollection クラスから新しいXmlSchemaSet クラスに移行するためのガイドを示します。 このコード例では、2 つのクラスの主な違いを次に示します。

古い XmlSchemaCollection コード例を次に示します。

Dim schemaCollection As XmlSchemaCollection = New XmlSchemaCollection()  
schemaCollection.Add("http://www.contoso.com/retail", "http://www.contoso.com/retail.xsd")  
schemaCollection.Add("http://www.contoso.com/books", "http://www.contoso.com/books.xsd")  
  
Dim schema As XmlSchema  
  
For Each schema in schemaCollection  
  
   Console.WriteLine(schema.TargetNamespace)  
  
Next  
XmlSchemaCollection schemaCollection = new XmlSchemaCollection();  
schemaCollection.Add("http://www.contoso.com/retail", "http://www.contoso.com/retail.xsd");  
schemaCollection.Add("http://www.contoso.com/books", "http://www.contoso.com/books.xsd");  
  
foreach(XmlSchema schema in schemaCollection)  
{  
   Console.WriteLine(schema.TargetNamespace);  
}  

コード例と同等の XmlSchemaSet を次に示します。

Dim schemaSet As XmlSchemaSet = New XmlSchemaSet()  
schemaSet.Add("http://www.contoso.com/retail", "http://www.contoso.com/retail.xsd")  
schemaSet.Add("http://www.contoso.com/books", "http://www.contoso.com/books.xsd")  
schemaSet.Compile()  
  
Dim schema As XmlSchema  
  
For Each schema in schemaSet.Schemas()  
  
   Console.WriteLine(schema.TargetNamespace)  
  
Next  
XmlSchemaSet schemaSet = new XmlSchemaSet();  
schemaSet.Add("http://www.contoso.com/retail", "http://www.contoso.com/retail.xsd");  
schemaSet.Add("http://www.contoso.com/books", "http://www.contoso.com/books.xsd");  
schemaSet.Compile();  
  
foreach(XmlSchema schema in schemaSet.Schemas())  
{  
   Console.WriteLine(schema.TargetNamespace);  
}  

スキーマの追加と取得

スキーマは、XmlSchemaSetAdd メソッドを使用してXmlSchemaSetに追加されます。 スキーマが XmlSchemaSetに追加されると、そのスキーマはターゲット名前空間 URI に関連付けられます。 ターゲット名前空間 URI は、 Add メソッドのパラメーターとして指定するか、ターゲット名前空間が指定されていない場合、 XmlSchemaSet はスキーマで定義されているターゲット名前空間を使用します。

スキーマは、XmlSchemaSetSchemas プロパティを使用してXmlSchemaSetから取得されます。 XmlSchemaSetSchemas プロパティを使用すると、XmlSchemaSetに含まれるXmlSchema オブジェクトを反復処理できます。 Schemas プロパティは、XmlSchemaSetに含まれるすべてのXmlSchema オブジェクトを返すか、ターゲット名前空間パラメーターを指定すると、ターゲット名前空間に属するすべてのXmlSchema オブジェクトを返します。 nullがターゲット名前空間パラメーターとして指定されている場合、Schemas プロパティは名前空間を持たないすべてのスキーマを返します。

次の例では、http://www.contoso.com/books名前空間のbooks.xsd スキーマをXmlSchemaSetに追加し、XmlSchemaSetからhttp://www.contoso.com/books名前空間に属するすべてのスキーマを取得してから、それらのスキーマをConsoleに書き込みます。

Dim schemaSet As XmlSchemaSet = New XmlSchemaSet  
schemaSet.Add("http://www.contoso.com/books", "books.xsd")  
  
Dim schema As XmlSchema  
  
For Each schema In schemaSet.Schemas("http://www.contoso.com/books")  
  
   schema.Write(Console.Out)  
  
Next  
XmlSchemaSet schemaSet = new XmlSchemaSet();  
schemaSet.Add("http://www.contoso.com/books", "books.xsd");  
  
foreach (XmlSchema schema in schemaSet.Schemas("http://www.contoso.com/books"))  
{  
   schema.Write(Console.Out);  
}  

XmlSchemaSet オブジェクトのスキーマの追加と取得の詳細については、Add メソッドとSchemas プロパティのリファレンス ドキュメントを参照してください。

スキーマのコンパイル

XmlSchemaSet内のスキーマは、XmlSchemaSetCompile メソッドによって 1 つの論理スキーマにコンパイルされます。

古い XmlSchemaCollection クラスとは異なり、 Add メソッドが呼び出されたときにスキーマはコンパイルされません。

Compile メソッドが正常に実行されると、XmlSchemaSetIsCompiled プロパティが true に設定されます。

XmlSchemaSetでスキーマを編集した場合、IsCompiled プロパティは影響を受けません。 XmlSchemaSet内の個々のスキーマの更新は追跡されません。 その結果、XmlSchemaSetにスキーマが追加または削除されていない限り、XmlSchemaSetに含まれるスキーマのいずれかが変更された場合でも、IsCompiled プロパティをtrueできます。

次の例では、 books.xsd ファイルを XmlSchemaSet に追加し、 Compile メソッドを呼び出します。

Dim schemaSet As XmlSchemaSet = New XmlSchemaSet()  
schemaSet.Add("http://www.contoso.com/books", "books.xsd")  
schemaSet.Compile()  
XmlSchemaSet schemaSet = new XmlSchemaSet();  
schemaSet.Add("http://www.contoso.com/books", "books.xsd");  
schemaSet.Compile();  

XmlSchemaSetでのスキーマのコンパイルの詳細については、Compile メソッドのリファレンス ドキュメントを参照してください。

スキーマの再処理

XmlSchemaSetでスキーマを再処理すると、XmlSchemaSetAdd メソッドが呼び出されたときにスキーマに対して実行されるすべての前処理手順が実行されます。 Reprocess メソッドの呼び出しが成功した場合、XmlSchemaSetIsCompiled プロパティは false に設定されます。

Reprocess メソッドは、XmlSchemaSetがコンパイルを実行した後にXmlSchemaSetのスキーマが変更された場合に使用する必要があります。

次の例は、Reprocess メソッドを使用してXmlSchemaSetに追加されたスキーマを再処理する方法を示しています。 Compile メソッドを使用してXmlSchemaSetがコンパイルされ、XmlSchemaSetに追加されたスキーマが変更されると、XmlSchemaSetのスキーマが変更された場合でも、IsCompiled プロパティはtrueに設定されます。 Reprocess メソッドを呼び出すと、Add メソッドによって実行されるすべての前処理が実行され、IsCompiled プロパティがfalseに設定されます。

Dim schemaSet As XmlSchemaSet = New XmlSchemaSet()  
Dim schema As XmlSchema = schemaSet.Add("http://www.contoso.com/books", "http://www.contoso.com/books.xsd")  
schemaSet.Compile()  
  
Dim element As XmlSchemaElement = New XmlSchemaElement()  
schema.Items.Add(element)  
element.Name = "book"  
element.SchemaTypeName = New XmlQualifiedName("string", "http://www.w3.org/2001/XMLSchema")  
  
schemaSet.Reprocess(schema)  
XmlSchemaSet schemaSet = new XmlSchemaSet();  
XmlSchema schema = schemaSet.Add("http://www.contoso.com/books", "http://www.contoso.com/books.xsd");  
schemaSet.Compile();  
  
XmlSchemaElement element = new XmlSchemaElement();  
schema.Items.Add(element);  
element.Name = "book";  
element.SchemaTypeName = new XmlQualifiedName("string", "http://www.w3.org/2001/XMLSchema");  
  
schemaSet.Reprocess(schema);  

XmlSchemaSetでのスキーマの再処理の詳細については、Reprocess メソッドのリファレンス ドキュメントを参照してください。

スキーマの確認

XmlSchemaSetContains メソッドを使用して、スキーマがXmlSchemaSet内に含まれているかどうかを確認できます。 Contains メソッドは、対象の名前空間またはチェック対象のXmlSchema オブジェクトを受け取ります。 いずれの場合も、Contains メソッドは、スキーマがXmlSchemaSet内に含まれている場合はtrueを返します。それ以外の場合は、falseを返します。

スキーマのチェックの詳細については、 Contains メソッドのリファレンス ドキュメントを参照してください。

スキーマの削除

スキーマは、XmlSchemaSetRemoveメソッドとRemoveRecursiveメソッドを使用して、XmlSchemaSetから削除されます。 Remove メソッドは指定したスキーマをXmlSchemaSetから削除しますが、RemoveRecursive メソッドは指定したスキーマと、XmlSchemaSetからインポートするすべてのスキーマを削除します。

次の例は、 XmlSchemaSetに複数のスキーマを追加した後、 RemoveRecursive メソッドを使用して、1 つのスキーマとインポートするすべてのスキーマを削除する方法を示しています。

Dim schemaSet As XmlSchemaSet = New XmlSchemaSet()  
schemaSet.Add("http://www.contoso.com/retail", "http://www.contoso.com/retail.xsd")  
schemaSet.Add("http://www.contoso.com/books", "http://www.contoso.com/books.xsd")  
schemaSet.Add("http://www.contoso.com/music", "http://www.contoso.com/music.xsd")  
  
Dim schema As XmlSchema  
  
For Each schema In schemaSet.Schemas()  
  
   If schema.TargetNamespace = "http://www.contoso.com/music" Then  
      schemaSet.RemoveRecursive(schema)  
   End If  
  
Next  
XmlSchemaSet schemaSet = new XmlSchemaSet();  
schemaSet.Add("http://www.contoso.com/retail", "http://www.contoso.com/retail.xsd");  
schemaSet.Add("http://www.contoso.com/books", "http://www.contoso.com/books.xsd");  
schemaSet.Add("http://www.contoso.com/music", "http://www.contoso.com/music.xsd");  
  
foreach (XmlSchema schema in schemaSet.Schemas())  
{  
   if (schema.TargetNamespace == "http://www.contoso.com/music")  
   {  
      schemaSet.RemoveRecursive(schema);  
   }  
}  

XmlSchemaSetからスキーマを削除する方法の詳細については、RemoveおよびRemoveRecursiveメソッドのリファレンス ドキュメントを参照してください。

スキーマの解決と xs:import

次の例では、特定の名前空間の複数のスキーマがXmlSchemaSetに存在する場合のスキーマのインポートのXmlSchemaSet動作について説明します。

たとえば、http://www.contoso.com名前空間の複数のスキーマを含むXmlSchemaSetについて考えてみます。 次の xs:import ディレクティブを持つスキーマが XmlSchemaSetに追加されます。

<xs:import namespace="http://www.contoso.com" schemaLocation="http://www.contoso.com/schema.xsd" />  

XmlSchemaSetは、http://www.contoso.com/schema.xsd URL からhttp://www.contoso.com名前空間のスキーマを読み込もうとします。 XmlSchemaSethttp://www.contoso.com名前空間の他のスキーマ ドキュメントがある場合でも、インポートするスキーマで使用できるのは、スキーマ ドキュメントで宣言されたスキーマ宣言と型だけです。 schema.xsd ファイルを http://www.contoso.com/schema.xsd URL に配置できない場合、http://www.contoso.com名前空間のスキーマはインポート中のスキーマにインポートされません。

XML ドキュメントの検証

XML ドキュメントは、 XmlSchemaSet内のスキーマに対して検証できます。 XML ドキュメントを検証するには、XmlReaderSettings オブジェクトのXmlSchemaSetSchemas プロパティにスキーマを追加するか、XmlReaderSettings オブジェクトのSchemas プロパティにXmlSchemaSetを追加します。 XmlReaderSettings オブジェクトは、XmlReader クラスのCreate メソッドによって使用され、XmlReader オブジェクトを作成し、XML ドキュメントを検証します。

XmlSchemaSetを使用した XML ドキュメントの検証の詳細については、「XmlSchemaSet での XML スキーマ (XSD) の検証」を参照してください。

こちらも参照ください