スキーマをコンパイルするための XmlSchemaSetXmlSchemaSet for Schema Compilation

XML スキーマ定義言語 (XSD) スキーマの格納と検証が可能なキャッシュである XmlSchemaSet について説明します。Describes the XmlSchemaSet, a cache where XML Schema definition language (XSD) schemas can be stored and validated.

XmlSchemaSet クラスThe XmlSchemaSet Class

XmlSchemaSet は、XML スキーマ定義言語 (XSD) スキーマの格納と検証が可能なキャッシュです。The XmlSchemaSet is a cache where XML Schema definition language (XSD) schemas can be stored and validated.

System.Xml Version 1.0 では、XML スキーマはスキーマのライブラリとして XmlSchemaCollection クラスに読み込まれました。In System.Xml version 1.0, XML schemas were loaded into an XmlSchemaCollection class as a library of schemas. System.Xml Version 2.0 では、XmlValidatingReader クラスおよび XmlSchemaCollection クラスは廃止され、それぞれ Create メソッドおよび XmlSchemaSet クラスによって置き換えられています。In System.Xml version 2.0, the XmlValidatingReader and the XmlSchemaCollection classes are obsolete, and have been replaced by the Create methods, and the XmlSchemaSet class respectively.

XmlSchemaSet は、標準との互換性、パフォーマンス、廃止された Microsoft XDR (XML-Data Reduced) スキーマ形式など、多くの問題を解決するために導入されました。The XmlSchemaSet has been introduced to fix a number of issues including standards compatibility, performance, and the obsolete Microsoft XML-Data Reduced (XDR) schema format.

以下は、XmlSchemaCollection クラスと XmlSchemaSet クラスの比較です。The following is a comparison between the XmlSchemaCollection class and the XmlSchemaSet class.

XmlSchemaCollectionXmlSchemaCollection XmlSchemaSetXmlSchemaSet
Microsoft XDR と W3C XML スキーマをサポート。Supports Microsoft XDR and W3C XML schemas. W3C XML スキーマだけをサポート。Only supports W3C XML schemas.
スキーマは、Add メソッドの呼び出し時にコンパイルされます。Schemas are compiled when the Add method is called. スキーマは、Add メソッドの呼び出し時にコンパイルされません。Schemas are not compiled when the Add method is called. これによって、スキーマ ライブラリ作成時のパフォーマンスが向上します。This provides a performance improvement during creation of the schema library.
各スキーマが個別のコンパイル済みバージョンを生成するため、"スキーマ アイランド" が発生する可能性があります。Each schema generates an individual compiled version that can result in "schema islands." 結果として、すべての include および import はそのスキーマ内だけにスコープ設定されます。As a result, all includes and imports are scoped only within that schema. コンパイル済みスキーマは、1 つの論理スキーマ (スキーマの集合を 1 つ) を生成します。Compiled schemas generate a single logical schema, a "set" of schemas. 1 つのスキーマ内の、その集合にインポートされ追加されるすべてのスキーマは、集合自体に直接追加されます。Any imported schemas within a schema that are added to the set are directly added to the set themselves. これは、すべてのスキーマに対して、すべての型を使用できることを意味しています。This means that all types are available to all schemas.
コレクション内では、特定の対象名前空間に対して 1 つのスキーマだけが存在可能です。Only one schema for a particular target namespace can exist in the collection. 型の競合がない限り、同じ対象名前空間に対して複数のスキーマを追加できます。Multiple schemas for the same target namespace can be added as long as there are no type conflicts.

XmlSchemaSet への移行Migrating to the XmlSchemaSet

次のサンプル コードでは、廃止された XmlSchemaSet クラスから新しい XmlSchemaCollection クラスへの移行のガイドを提供します。The following code example provides a guide to migrating to the new XmlSchemaSet class from the obsolete XmlSchemaCollection class. このコード サンプルは、次に挙げるこれら 2 つのクラスの主な相違点を説明するものです。The code example illustrates the following major differences between the two classes.

廃止された XmlSchemaCollection のコード サンプルを次に示します。The following is the obsolete XmlSchemaCollection code example.

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 のコード サンプルを次に示します。The following is the equivalent XmlSchemaSet code example.

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);  
}  

スキーマの追加と取り出しAdding and Retrieving Schemas

スキーマは XmlSchemaSetAdd メソッドを使用して XmlSchemaSet に追加されます。Schemas are added to an XmlSchemaSet using the Add method of the XmlSchemaSet. スキーマが XmlSchemaSet に追加される場合、そのスキーマは対象名前空間の URI に関連付けられます。When a schema is added to an XmlSchemaSet, it is associated with a target namespace URI. 対象名前空間の URI は、Add メソッドへのパラメーターとして指定するか、名前空間が指定されていない場合、XmlSchemaSet がスキーマ内に定義されている名前空間を使用するかのどちらかです。The target namespace URI can either be specified as a parameter to the Add method or if no target namespace is specified, the XmlSchemaSet uses the target namespace defined in the schema.

スキーマは XmlSchemaSetSchemas プロパティを使用して XmlSchemaSet から取り出されます。Schemas are retrieved from an XmlSchemaSet using the Schemas property of the XmlSchemaSet. SchemasXmlSchemaSet プロパティでは、XmlSchema に含まれる XmlSchemaSet オブジェクトに対して繰り返すことができます。The Schemas property of the XmlSchemaSet allows you to iterate over the XmlSchema objects contained in the XmlSchemaSet. Schemas プロパティは、XmlSchema に含まれるすべての XmlSchemaSet オブジェクトを返すか、または対象名前空間のパラメーターが指定された場合、その名前空間に属するすべての XmlSchema オブジェクトを返すかのどちらかです。The Schemas property either returns all the XmlSchema objects contained in the XmlSchemaSet, or, given a target namespace parameter, returns all the XmlSchema objects that belong to the target namespace. 対象名前空間として null が指定された場合、Schemas プロパティは名前空間のないスキーマをすべて返します。If null is specified as the target namespace parameter, the Schemas property returns all schemas without a namespace.

次の例では、books.xsd 名前空間内の http://www.contoso.com/books スキーマを XmlSchemaSet に追加し、http://www.contoso.com/books 名前空間に属しているすべてのスキーマを XmlSchemaSet から取り出した後、それらのスキーマを Console に書き出します。The following example adds the books.xsd schema in the http://www.contoso.com/books namespace to an XmlSchemaSet, retrieves all schemas that belong to the http://www.contoso.com/books namespace from the XmlSchemaSet, and then writes those schemas to the 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 プロパティのリファレンス ドキュメントを参照してください。For more information about adding and retrieving schemas from an XmlSchemaSet object, see the Add method and the Schemas property reference documentation.

スキーマのコンパイルCompiling Schemas

XmlSchemaSet 内のスキーマは、CompileXmlSchemaSet メソッドによって、1 つの論理スキーマにコンパイルされます。Schemas in an XmlSchemaSet are compiled into one logical schema by the Compile method of the XmlSchemaSet.

注意

廃止された XmlSchemaCollection クラスとは異なり、スキーマは Add メソッドの呼び出し時にはコンパイルされません。Unlike the obsolete XmlSchemaCollection class, schemas are not compiled when the Add method is called.

Compile メソッドの実行が成功した場合、IsCompiledXmlSchemaSet プロパティは true に設定されます。If the Compile method executes successfully, the IsCompiled property of the XmlSchemaSet is set to true.

注意

IsCompiled プロパティは、スキーマが XmlSchemaSet 内にあるときに編集されても、影響を受けません。The IsCompiled property is not affected if schemas are edited while in the XmlSchemaSet. XmlSchemaSet 内の個別のスキーマの更新は追跡されません。Updates of the individual schemas in the XmlSchemaSet are not tracked. その結果、IsCompiled プロパティは、true のスキーマが追加または削除されない限り、XmlSchemaSet に含まれるスキーマの 1 つが変更されていても、XmlSchemaSet になる可能性があります。As a result, the IsCompiled property can be true even though one of the schemas contained in the XmlSchemaSet has been altered, as long as no schemas were added or removed from the XmlSchemaSet.

次の例では、books.xsd ファイルを XmlSchemaSet に追加した後、Compile メソッドを呼び出します。The following example adds the books.xsd file to the XmlSchemaSet and then calls the Compile method.

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 メソッドのリファレンス ドキュメントを参照してください。For more information about compiling schemas in an XmlSchemaSet, see the Compile method reference documentation.

スキーマの再処理Reprocessing Schemas

XmlSchemaSet 内のスキーマの再処理は、AddXmlSchemaSet メソッド呼び出し時にスキーマに対して実行されるすべての前処理手順を実行します。Reprocessing a schema in an XmlSchemaSet performs all the preprocessing steps performed on a schema when the Add method of the XmlSchemaSet is called. Reprocess メソッドの呼び出しが成功した場合、IsCompiledXmlSchemaSet プロパティは false に設定されます。If the call to the Reprocess method is successful, the IsCompiled property of the XmlSchemaSet is set to false.

Reprocess のコンパイル後、XmlSchemaSet 内のスキーマが変更された場合は、XmlSchemaSet メソッドを使用する必要があります。The Reprocess method should be used when a schema in the XmlSchemaSet has been modified after the XmlSchemaSet has performed compilation.

次の例は、XmlSchemaSet メソッドを使用して Reprocess に追加されたスキーマの再処理を示しています。The following example illustrates reprocessing a schema added to the XmlSchemaSet using the Reprocess method. XmlSchemaSet メソッドを使用して Compile がコンパイルされた後、XmlSchemaSet に追加されたスキーマが変更された場合、IsCompiled 内のスキーマは変更されているのに、true プロパティは XmlSchemaSet に設定されています。After the XmlSchemaSet is compiled using the Compile method, and the schema added to the XmlSchemaSet is modified, the IsCompiled property is set to true even though a schema in the XmlSchemaSet has been modified. Reprocess メソッドの呼び出しは、Add メソッドによって実行されるすべての前処理を実行し、IsCompiled プロパティを false に設定します。Calling the Reprocess method performs all the preprocessing performed by the Add method, and sets the IsCompiled property to 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 メソッドのリファレンス ドキュメントを参照してください。For more information about reprocessing a schema in an XmlSchemaSet, see the Reprocess method reference documentation.

スキーマの確認Checking for a Schema

ContainsXmlSchemaSet メソッドを使用して、XmlSchemaSet 内にスキーマが含まれているかどうかを確認できます。You can use the Contains method of the XmlSchemaSet to check if a schema is contained within an XmlSchemaSet. Contains メソッドは、確認対象に対象名前空間または XmlSchema オブジェクトのどちらかを受け取ります。The Contains method takes either a target namespace or an XmlSchema object to check for. どちらの場合も、Contains メソッドは、true 内にスキーマが含まれている場合 XmlSchemaSet を、それ以外の場合 false を返します。In either case, the Contains method returns true if the schema is contained within the XmlSchemaSet; otherwise, it returns false.

スキーマの確認に関する詳細については、Contains メソッドのリファレンス ドキュメントを参照してださい。For more information about checking for a schema, see the Contains method reference documentation.

スキーマの削除Removing Schemas

スキーマは XmlSchemaSetRemove および RemoveRecursive メソッドを使用して XmlSchemaSet から削除されます。Schemas are removed from an XmlSchemaSet using the Remove and RemoveRecursive methods of the XmlSchemaSet. Remove メソッドは、指定されたスキーマを XmlSchemaSet から削除し、RemoveRecursive メソッドは、指定されたスキーマとそのスキーマがインポートしているすべてのスキーマを XmlSchemaSet から削除します。The Remove method removes the specified schema from the XmlSchemaSet, while the RemoveRecursive method removes the specified schema and all the schemas it imports from the XmlSchemaSet.

以下は、複数のスキーマを XmlSchemaSet に追加してから、RemoveRecursive メソッドを使用して、それらのスキーマの 1 つとそのスキーマがインポートしているすべてのスキーマを削除する例を示しています。The following example illustrates adding multiple schemas to an XmlSchemaSet, then using the RemoveRecursive method to remove one of the schemas and all the schemas it imports.

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 メソッドのリファレンス ドキュメントを参照してください。For more information about removing schemas from an XmlSchemaSet, see the Remove and RemoveRecursive methods reference documentation.

スキーマの解決と xs:importSchema Resolution and xs:import

次の例は、XmlSchemaSet 内で、指定された名前空間に対して複数のスキーマが存在するときに、スキーマをインポートする場合の XmlSchemaSet の動作を示しています。The following examples describe the XmlSchemaSet behavior for importing schemas when multiple schemas for a given namespace exist in an XmlSchemaSet.

例として、XmlSchemaSet 名前空間に関する複数のスキーマを含む http://www.contoso.com を考えます。For example, consider an XmlSchemaSet that contains multiple schemas for the http://www.contoso.com namespace. 次の xs:import ディレクティブを持つスキーマが XmlSchemaSet に追加されます。A schema with the following xs:import directive is added to the 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 名前空間に関するスキーマをインポートしようとします。The XmlSchemaSet attempts to import a schema for the http://www.contoso.com namespace by loading it from the http://www.contoso.com/schema.xsd URL. http://www.contoso.com 名前空間に関する他のスキーマ ドキュメントが XmlSchemaSet 内にある場合でも、インポート元のスキーマでは、スキーマ宣言とそのスキーマ ドキュメント内で定義した型だけしか使用できません。Only the schema declaration and types declared in the schema document are available in the importing schema, even though there are other schema documents for the http://www.contoso.com namespace in the XmlSchemaSet. schema.xsd ファイルが http://www.contoso.com/schema.xsd URL で見つからない場合、http://www.contoso.com 名前空間に関するスキーマは、インポート元のスキーマにインポートされません。If the schema.xsd file cannot be located at the http://www.contoso.com/schema.xsd URL, no schema for the http://www.contoso.com namespace is imported into the importing schema.

XML ドキュメントの検証Validating XML Documents

XML ドキュメントは、XmlSchemaSet 内のスキーマに対して検証できます。XML documents can be validated against schemas in an XmlSchemaSet. スキーマを XmlReaderSettings オブジェクトの XmlSchemaSetSchemas プロパティに追加するか、XmlSchemaSetXmlReaderSettings オブジェクトの Schemas プロパティに追加することによって、XML ドキュメントを検証します。You validate an XML document by adding a schema to the XmlSchemaSetSchemas property of an XmlReaderSettings object, or by adding an XmlSchemaSet to the Schemas property of an XmlReaderSettings object. 次に、XmlReaderSettings オブジェクトを作成して、XML ドキュメントを検証するために、Create オブジェクトが XmlReader クラスの XmlReader メソッドによって使用されます。The XmlReaderSettings object is then used by the Create method of the XmlReader class to create an XmlReader object and validate the XML document.

XmlSchemaSet を利用して XML 文書を検証する方法については、「XmlSchemaSet による XML スキーマ (XSD) 検証」を参照してください。For more information about validating XML documents using an XmlSchemaSet, see XML Schema (XSD) Validation with XmlSchemaSet.

関連項目See also