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 クラスのAdd メソッドとは異なり、XmlSchemaSetのAdd メソッドを呼び出すときにスキーマはコンパイルされません。 XmlSchemaSetのCompile メソッドは、コード例で明示的に呼び出されます。
XmlSchemaSetを反復処理するには、XmlSchemaSetの Schemas プロパティを使用する必要があります。
古い 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から取得されます。
XmlSchemaSetの Schemas プロパティを使用すると、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内のスキーマは、XmlSchemaSetのCompile メソッドによって 1 つの論理スキーマにコンパイルされます。
注
古い XmlSchemaCollection クラスとは異なり、 Add メソッドが呼び出されたときにスキーマはコンパイルされません。
Compile メソッドが正常に実行されると、XmlSchemaSetの IsCompiled プロパティが 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でスキーマを再処理すると、XmlSchemaSetのAdd メソッドが呼び出されたときにスキーマに対して実行されるすべての前処理手順が実行されます。
Reprocess メソッドの呼び出しが成功した場合、XmlSchemaSetのIsCompiled プロパティは 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 メソッドのリファレンス ドキュメントを参照してください。
スキーマの確認
XmlSchemaSetの Contains メソッドを使用して、スキーマがXmlSchemaSet内に含まれているかどうかを確認できます。
Contains メソッドは、対象の名前空間またはチェック対象のXmlSchema オブジェクトを受け取ります。 いずれの場合も、Contains メソッドは、スキーマがXmlSchemaSet内に含まれている場合はtrue
を返します。それ以外の場合は、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動作について説明します。
たとえば、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
名前空間のスキーマを読み込もうとします。
XmlSchemaSetにhttp://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) の検証」を参照してください。
こちらも参照ください
.NET