次の方法で共有


スキーマをコンパイルするための 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 への移行

次のサンプル コードでは、廃止された XmlSchemaCollection クラスから新しい XmlSchemaSet クラスへの移行のガイドを提供します。このコード サンプルは、次に挙げるこれら 2 つのクラスの主な相違点を説明するものです。

廃止された XmlSchemaCollection のコード サンプルを次に示します。

Dim schemaCollection As XmlSchemaCollection = New XmlSchemaCollection()
schemaCollection.Add("https://www.contoso.com/retail", "https://www.contoso.com/retail.xsd")
schemaCollection.Add("https://www.contoso.com/books", "https://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("https://www.contoso.com/retail", "https://www.contoso.com/retail.xsd");
schemaCollection.Add("https://www.contoso.com/books", "https://www.contoso.com/books.xsd");

foreach(XmlSchema schema in schemaCollection)
{
   Console.WriteLine(schema.TargetNamespace);
}

対応する XmlSchemaSet のコード サンプルを次に示します。

Dim schemaSet As XmlSchemaSet = New XmlSchemaSet()
schemaSet.Add("https://www.contoso.com/retail", "https://www.contoso.com/retail.xsd")
schemaSet.Add("https://www.contoso.com/books", "https://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("https://www.contoso.com/retail", "https://www.contoso.com/retail.xsd");
schemaSet.Add("https://www.contoso.com/books", "https://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 プロパティは名前空間のないスキーマをすべて返します。

次の例では、https://www.contoso.com/books 名前空間内の books.xsd スキーマを XmlSchemaSet に追加し、https://www.contoso.com/books 名前空間に属しているすべてのスキーマを XmlSchemaSet から取り出した後、それらのスキーマを Console に書き出します。

Dim schemaSet As XmlSchemaSet = New XmlSchemaSet
schemaSet.Add("https://www.contoso.com/books", "books.xsd")

Dim schema As XmlSchema

For Each schema In schemaSet.Schemas("https://www.contoso.com/books")

   schema.Write(Console.Out)

Next
XmlSchemaSet schemaSet = new XmlSchemaSet();
schemaSet.Add("https://www.contoso.com/books", "books.xsd");

foreach (XmlSchema schema in schemaSet.Schemas("https://www.contoso.com/books"))
{
   schema.Write(Console.Out);
}

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

スキーマのコンパイル

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

メモメモ

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

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

メモメモ

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

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

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

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

スキーマの再処理

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

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

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

Dim schemaSet As XmlSchemaSet = New XmlSchemaSet()
Dim schema As XmlSchema = schemaSet.Add("https://www.contoso.com/books", "https://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("https://www.contoso.com/books", "https://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("https://www.contoso.com/retail", "https://www.contoso.com/retail.xsd")
schemaSet.Add("https://www.contoso.com/books", "https://www.contoso.com/books.xsd")
schemaSet.Add("https://www.contoso.com/music", "https://www.contoso.com/music.xsd")

Dim schema As XmlSchema

For Each schema In schemaSet.Schemas()

   If schema.TargetNamespace = "https://www.contoso.com/music" Then
      schemaSet.RemoveRecursive(schema)
   End If

Next
XmlSchemaSet schemaSet = new XmlSchemaSet();
schemaSet.Add("https://www.contoso.com/retail", "https://www.contoso.com/retail.xsd");
schemaSet.Add("https://www.contoso.com/books", "https://www.contoso.com/books.xsd");
schemaSet.Add("https://www.contoso.com/music", "https://www.contoso.com/music.xsd");

foreach (XmlSchema schema in schemaSet.Schemas())
{
   if (schema.TargetNamespace == "https://www.contoso.com/music")
   {
      schemaSet.RemoveRecursive(schema);
   }
}

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

スキーマの解決と xs:import

次の例は、XmlSchemaSet 内で、指定された名前空間に対して複数のスキーマが存在するときに、スキーマをインポートする場合の XmlSchemaSet の動作を示しています。

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

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

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

XML ドキュメントの検証

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

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

参照

参照

Add

Schemas

Contains

Compile

Reprocess

Remove

RemoveRecursive

概念

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

XmlSchemaSet による XML スキーマ (XSD) 検証