スキーマをコンパイルするための 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 つのクラスの主な相違点を説明するものです。
Add クラスの XmlSchemaCollection メソッドとは異なり、スキーマは Add の XmlSchemaSet メソッド呼び出し時にはコンパイルされません。 サンプル コード内では、Compile の XmlSchemaSet メソッドが明示的に呼び出されます。
XmlSchemaSet を繰り返すには、Schemas の XmlSchemaSet プロパティを使用する必要があります。
廃止された 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);
}
スキーマの追加と取り出し
スキーマは XmlSchemaSet の Add メソッドを使用して XmlSchemaSet に追加されます。 スキーマが XmlSchemaSet に追加される場合、そのスキーマは対象名前空間の URI に関連付けられます。 対象名前空間の URI は、Add メソッドへのパラメーターとして指定するか、名前空間が指定されていない場合、XmlSchemaSet がスキーマ内に定義されている名前空間を使用するかのどちらかです。
スキーマは XmlSchemaSet の Schemas プロパティを使用して XmlSchemaSet から取り出されます。 Schemas の XmlSchemaSet プロパティでは、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 内のスキーマは、Compile の XmlSchemaSet メソッドによって、1 つの論理スキーマにコンパイルされます。
注意
廃止された XmlSchemaCollection クラスとは異なり、スキーマは Add メソッドの呼び出し時にはコンパイルされません。
Compile メソッドの実行が成功した場合、IsCompiled の XmlSchemaSet プロパティは 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 内のスキーマの再処理は、Add の XmlSchemaSet メソッド呼び出し時にスキーマに対して実行されるすべての前処理手順を実行します。 Reprocess メソッドの呼び出しが成功した場合、IsCompiled の XmlSchemaSet プロパティは 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 メソッドのリファレンス ドキュメントを参照してください。
スキーマの確認
Contains の XmlSchemaSet メソッドを使用して、XmlSchemaSet 内にスキーマが含まれているかどうかを確認できます。 Contains メソッドは、確認対象に対象名前空間または XmlSchema オブジェクトのどちらかを受け取ります。 どちらの場合も、Contains メソッドは、true
内にスキーマが含まれている場合 XmlSchemaSet を、それ以外の場合 false
を返します。
スキーマの確認に関する詳細については、Contains メソッドのリファレンス ドキュメントを参照してださい。
スキーマの削除
スキーマは XmlSchemaSet の Remove および 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 プロパティに追加するか、XmlSchemaSet を XmlReaderSettings オブジェクトの Schemas プロパティに追加することによって、XML ドキュメントを検証します。 次に、XmlReaderSettings オブジェクトを作成して、XML ドキュメントを検証するために、Create オブジェクトが XmlReader クラスの XmlReader メソッドによって使用されます。
XmlSchemaSet を利用して XML 文書を検証する方法については、「XmlSchemaSet による XML スキーマ (XSD) 検証」を参照してください。
関連項目
.NET