スキーマをコンパイルするための XmlSchemaSet

XML スキーマ定義言語 (XSD) スキーマの格納と検証が可能なキャッシュである XmlSchemaSet について説明します。

XmlSchemaSet クラス

XmlSchemaSet は、XML スキーマ定義言語 (XSD) スキーマの格納と検証が可能なキャッシュです。

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

XmlSchemaSet は、標準との互換性、パフォーマンス、廃止された Microsoft XDR (XML-Data Reduced) スキーマ形式など、多くの問題を解決するために導入されました。

以下は、XmlSchemaCollection クラスと XmlSchemaSet クラスの比較です。

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

XmlSchemaSet への移行

次のサンプル コードでは、廃止された XmlSchemaSet クラスから新しい XmlSchemaCollection クラスへの移行のガイドを提供します。 このコード サンプルは、次に挙げるこれら 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 から取り出されます。 SchemasXmlSchemaSet プロパティでは、XmlSchema に含まれる XmlSchemaSet オブジェクトに対して繰り返すことができます。 Schemas プロパティは、XmlSchema に含まれるすべての XmlSchemaSet オブジェクトを返すか、または対象名前空間のパラメーターが指定された場合、その名前空間に属するすべての XmlSchema オブジェクトを返すかのどちらかです。 対象名前空間として null が指定された場合、Schemas プロパティは名前空間のないスキーマをすべて返します。

次の例では、books.xsd 名前空間内の http://www.contoso.com/books スキーマを XmlSchemaSet に追加し、http://www.contoso.com/books 名前空間に属しているすべてのスキーマを XmlSchemaSet から取り出した後、それらのスキーマを 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 内のスキーマは、CompileXmlSchemaSet メソッドによって、1 つの論理スキーマにコンパイルされます。

注意

廃止された XmlSchemaCollection クラスとは異なり、スキーマは Add メソッドの呼び出し時にはコンパイルされません。

Compile メソッドの実行が成功した場合、IsCompiledXmlSchemaSet プロパティは true に設定されます。

注意

IsCompiled プロパティは、スキーマが XmlSchemaSet 内にあるときに編集されても、影響を受けません。 XmlSchemaSet 内の個別のスキーマの更新は追跡されません。 その結果、IsCompiled プロパティは、true のスキーマが追加または削除されない限り、XmlSchemaSet に含まれるスキーマの 1 つが変更されていても、XmlSchemaSet になる可能性があります。

次の例では、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 内のスキーマの再処理は、AddXmlSchemaSet メソッド呼び出し時にスキーマに対して実行されるすべての前処理手順を実行します。 Reprocess メソッドの呼び出しが成功した場合、IsCompiledXmlSchemaSet プロパティは false に設定されます。

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

次の例は、XmlSchemaSet メソッドを使用して Reprocess に追加されたスキーマの再処理を示しています。 XmlSchemaSet メソッドを使用して Compile がコンパイルされた後、XmlSchemaSet に追加されたスキーマが変更された場合、IsCompiled 内のスキーマは変更されているのに、true プロパティは XmlSchemaSet に設定されています。 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 メソッドのリファレンス ドキュメントを参照してください。

スキーマの確認

ContainsXmlSchemaSet メソッドを使用して、XmlSchemaSet 内にスキーマが含まれているかどうかを確認できます。 Contains メソッドは、確認対象に対象名前空間または XmlSchema オブジェクトのどちらかを受け取ります。 どちらの場合も、Contains メソッドは、true 内にスキーマが含まれている場合 XmlSchemaSet を、それ以外の場合 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 の動作を示しています。

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

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

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

XML ドキュメントの検証

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

XmlSchemaSet を利用して XML 文書を検証する方法については、「XmlSchemaSet による XML スキーマ (XSD) 検証」を参照してください。

関連項目