次の方法で共有


XML からの DataSet スキーマ情報の読み込み

DataSetのスキーマ (そのテーブル、列、リレーション、制約) は、プログラムによって定義するか、の Fill メソッドまたは FillSchema メソッドによって作成するか、XML ドキュメントから読み込むことができます。DataAdapter XML ドキュメントから DataSet スキーマ情報を読み込むには、 DataSet の ReadXmlSchema メソッドまたは InferXmlSchema メソッドを使用 できますReadXmlSchema を使用すると、XML スキーマ定義言語 (XSD) スキーマを含むドキュメント、またはインライン XML スキーマを含む XML ドキュメントから DataSet スキーマ情報を読み込んだり推論したりできます。 InferXmlSchema を使用すると、指定した特定の XML 名前空間を無視しながら、XML ドキュメントからスキーマを推論できます。

Web サービスまたは XML シリアル化を使用して XSD コンストラクト (入れ子になったリレーションシップなど) を使用してメモリ内に作成された DataSet を転送する場合、DataSet 内のテーブルの順序は保持されない場合があります。 したがって、この場合、 DataSet の受信者はテーブルの順序に依存しないでください。 ただし、転送される DataSet のスキーマがメモリ内に作成されるのではなく、XSD ファイルから読み取られた場合、テーブルの順序は常に保持されます。

ReadXmlSchema

データを読み込まずに XML ドキュメントから DataSet のスキーマを読み込むには、DataSetReadXmlSchema メソッドを使用できます。 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 リレーショナル構造の推論」を参照してください。

ReadXmlSchemaDataSet のスキーマのみを読み込むか推論しますが、DataSetReadXml メソッドは、XML ドキュメントに含まれるスキーマとデータの両方を読み込んだり推論したりします。 詳細については、「 XML からの DataSet の読み込み」を参照してください。

次のコード例は、XML ドキュメントまたはストリームから DataSet スキーマを読み込む方法を示しています。 最初の例は、 ReadXmlSchema メソッドに渡される XML スキーマ ファイル名を示しています。 2 番目の例は 、System.IO.StreamReader を示しています。

Dim dataSet As DataSet = New DataSet  
dataSet.ReadXmlSchema("schema.xsd")  
DataSet dataSet = new DataSet();  
dataSet.ReadXmlSchema("schema.xsd");  
Dim xmlStream As New System.IO.StreamReader("schema.xsd")
Dim dataSet As DataSet = New DataSet  
dataSet.ReadXmlSchema(xmlStream)  
xmlStream.Close()  
System.IO.StreamReader xmlStream = new System.IO.StreamReader("schema.xsd");  
DataSet dataSet = new DataSet();  
dataSet.ReadXmlSchema(xmlStream);  
xmlStream.Close();  

InferXmlSchema

DataSetInferXmlSchema メソッドを使用して、XML ドキュメントからスキーマを推論するように DataSet に指示することもできます。 InferXmlSchema は、InferSchemaXmlReadMode (データの読み込みとスキーマの推論) を使用した ReadXml と、読み取られるドキュメントにインライン スキーマが含まれない場合の ReadXmlSchema の両方と同じように機能します。 ただし、 InferXmlSchema には、スキーマの推論時に無視する特定の XML 名前空間を指定できる追加機能が用意されています。 InferXmlSchema は、ファイル名、ストリーム、または XmlReader で指定された XML ドキュメントの場所という 2 つの必須引数を受け取ります。および操作によって無視される XML 名前空間の文字列配列。

たとえば、次の 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 メソッドと InferSchemaXmlReadMode を持つ ReadXml メソッドの両方で、ドキュメント内のすべての要素 (CategoriesCategoryIDCategoryNameDescriptionProductsProductIDReorderLevelDiscontinued) のテーブルが作成されます。 (詳細については、「XML からの DataSet リレーショナル構造の推論」を参照してください)。ただし、より適切な構造は、Categories テーブルと Products テーブルのみを作成し、Categories テーブルに CategoryIDCategoryNameDescription 列を作成し、Products テーブルに ProductIDReorderLevel、および Discontinued 列を作成することです。 推論されたスキーマで XML 要素で指定された属性が無視されるようにするには、 InferXmlSchema メソッドを使用し、無視する officedata の XML 名前空間を次の例に示すように指定します。

Dim dataSet As DataSet = New DataSet  
dataSet.InferXmlSchema("input_od.xml", New String() {"urn:schemas-microsoft-com:officedata"})  
DataSet dataSet = new DataSet();  
dataSet.InferXmlSchema("input_od.xml", new string[] "urn:schemas-microsoft-com:officedata");  

こちらも参照ください