DataSet のスキーマ (Dataset のテーブル、列、リレーションシップ、および制約) は、プログラムを使用して定義され、DataAdapter の Fill メソッドまたは FillSchema メソッドによって作成され、XML ドキュメントから読み込まれます。XML ドキュメントから DataSet スキーマ情報を読み込むには、DataSet の ReadXmlSchema メソッドまたは InferXmlSchema メソッドを使用します。ReadXmlSchema を使用すると、XML スキーマ定義言語 (XSD) スキーマが含まれているドキュメントまたはインライン XML スキーマが含まれている XML ドキュメントから、DataSet スキーマ情報を読み込むかまたは推論できます。InferXmlSchema を使用すると、XML ドキュメントからスキーマを推論できます。このとき、指定した特定の XML 名前空間は無視されます。
ReadXmlSchema
XML ドキュメントから DataSet のスキーマだけを読み込み、データを読み込まないようにするには、DataSet の ReadXmlSchema メソッドを使用します。ReadXmlSchema は、XML スキーマ定義言語 (XSD) スキーマを使用して定義されている DataSet を作成します。
ReadXmlSchema メソッドは、読み込む XML ドキュメントが格納されている XmlReader、ファイル名、またはストリームのいずれか 1 つを引数として受け取ります。この XML ドキュメントには、スキーマだけが含まれているか、またはデータのある XML 要素と共にスキーマがインラインで含まれています。XML スキーマとしてのインライン スキーマの書き込み方法の詳細については、「XML スキーマ (XSD) からの DataSet リレーショナル構造の生成」を参照してください。
ReadXmlSchema に渡された XML ドキュメントに、インライン スキーマ情報が含まれていない場合、ReadXmlSchema は XML ドキュメントの要素からスキーマを推論します。DataSet に既にスキーマが含まれている場合には、現在のスキーマを拡張するため、新しい列が既存のテーブルに追加されます。テーブルが存在しない場合には、新しいテーブルが追加されます。追加される列が既に DataSet に存在していますが、XML で検出された列の型と矛盾する場合には、例外がスローされます。ReadXmlSchema による XML ドキュメントからのスキーマの推論方法の詳細については、「XML からの DataSet リレーショナル構造の推論」を参照してください。
ReadXmlSchema は DataSet スキーマの読み込みまたは推論のいずれかを実行しますが、DataSet の ReadXml メソッドは、スキーマと XML ドキュメントのデータの両方の読み込みまたは推論を実行します。詳細については、「XML からの DataSet の読み込み」を参照してください。
XML ドキュメントまたは XML ストリームから DataSet スキーマを読み込む方法を次のコード例に示します。1 番目の例では、XML スキーマ ファイル名が ReadXmlSchema メソッドへ渡されます。2 番目の例では、System.IO.StreamReader が示されています。
Dim myDS As DataSet = New DataSet
myDS.ReadXmlSchema("schema.xsd")
[C#]
DataSet myDS = new DataSet();
myDS.ReadXmlSchema("schema.xsd");
[Visual Basic]
Dim xmlStream As System.IO.StreamReader = New System.IO.StreamReader ("schema.xsd");
Dim myDS As DataSet = New DataSet
myDS.ReadXmlSchema(xmlStream)
xmlStream.Close()
[C#]
System.IO.StreamReader xmlStream = new System.IO.StreamReader("schema.xsd");
DataSet myDS = new DataSet();
myDS.ReadXmlSchema(xmlStream);
xmlStream.Close();
InferXmlSchema
DataSet に対し、DataSet の InferXmlSchema メソッドを使用して XML ドキュメントのスキーマを推論するように指示できます。InferXmlSchema は、XmlReadMode を InferSchema に設定した ReadXml (データの読み込みとスキーマの推論) と、読み取られるドキュメントにインライン スキーマが含まれていない場合の ReadXmlSchema の両方と同様の機能を備えています。ただし InferXmlSchema には、スキーマを推論するときに無視する特定の XML 名前空間を指定できる追加機能を用意しています。InferXmlSchema に必要な 2 つの引数は、XML ドキュメントの位置と、この操作によって無視される XML 名前空間の文字列配列です。XML ドキュメントの位置は、ファイル名、ストリーム、または XmlReader によって指定されます。
たとえば、次のような XML があるとします。
<NewDataSet xmlns:od="urn:schemas-microsoft-com:officedata">
<Categories>
<CategoryID od:adotype="3">1</CategoryID>
<CategoryName od:maxLength="15" od:adotype="130">Beverages</CategoryName>
<Description od:adotype="203">Soft drinks and teas</Description>
</Categories>
<Products>
<ProductID od:adotype="20">1</ProductID>
<ReorderLevel od:adotype="3">10</ReorderLevel>
<Discontinued od:adotype="11">0</Discontinued>
</Products>
</NewDataSet>
前述の XML ドキュメントの要素に対して指定されている属性により、ReadXmlSchema メソッドと、XmlReadMode が InferSchema に設定されている ReadXml メソッドは、いずれもドキュメントのすべての要素 (Categories、CategoryID、CategoryName、Description、Products、ProductID、ReorderLevel、および Discontinued) に対してテーブルを作成します。詳細については、「XML からの DataSet リレーショナル構造の推論」を参照してください。ただし、この作成方法よりも適切な方法としては、最初に Categories テーブルと Products テーブルだけを作成し、次に Categories テーブルの CategoryID、CategoryName、および Description 列を作成し、Products テーブルの ProductID、ReorderLevel、および Discontinued 列を作成する方法があります。推論されたスキーマが、XML 要素に指定されている属性を無視するようにするには、InferXmlSchema メソッドを使用して officedata の XML 名前空間を無視するように指定します。この例を次に示します。
Dim myDS As DataSet = New DataSet
myDS.InferXmlSchema("input_od.xml", New String[] {"urn:schemas-microsoft-com:officedata"})
[C#]
DataSet myDS = new DataSet();
myDS.InferXmlSchema("input_od.xml", new string[] "urn:schemas-microsoft-com:officedata");
参照
XML と DataSet | XML スキーマ (XSD) からの DataSet リレーショナル構造の生成 | XML からの DataSet リレーショナル構造の推論 | XML からの DataSet の読み込み | DataSet の作成および使用