ADO.NET では XML ストリームまたは XML ドキュメントから DataSet の内容を作成できます。また、.NET Framework では、XML から読み込まれる情報と DataSet のスキーマ (リレーショナル構造体) の作成方法を柔軟に変更できます。
DataSet に XML のデータを格納するには、DataSet オブジェクトの ReadXml メソッドを使用します。ReadXml メソッドは、ファイル、ストリーム、または XmlReader からデータを読み取り、XML のソースを引数として受け取ります。また、XmlReadMode 引数を受け取ることもあります。XmlReader の詳細については、「XmlTextReader による XML データの読み取り」を参照してください。ReadXml メソッドは、XML ストリームまたは XML ドキュメントの内容を読み取り、DataSet にデータを読み込みます。また、指定されている XmlReadMode と、リレーショナル スキーマが既に存在しているかどうかに応じて、DataSet のリレーショナル スキーマも作成します。
XmlReadMode 引数のオプションを次の表に示します。
XmlReadMode | 説明 |
---|---|
Auto | これは、既定の設定です。XML を調べ、次の順序で最適なオプションを選択します。
読み取られる XML の形式が判明している場合は、パフォーマンスを最大限に引き出すため、既定値 Auto を使用する代わりに、XmlReadMode を明示的に設定することをお勧めします。 |
ReadSchema | インライン スキーマを読み取り、データとスキーマを読み込みます。
DataSet に既にスキーマが含まれている場合には、読み取るインライン スキーマの新しいテーブルが DataSet の既存のスキーマへ追加されます。インライン スキーマのテーブルが既に DataSet に存在している場合には、例外がスローされます。XmlReadMode.ReadSchema を使用して既存のテーブルのスキーマを修正できません。 DataSet にスキーマが含まれておらず、インライン スキーマが存在しない場合には、データは読み取られません。 インライン スキーマを定義するには、XML スキーマ定義言語 (XSD) スキーマを使用します。XML スキーマとしてのインライン スキーマの書き込み方法の詳細については、「XML スキーマ (XSD) からの DataSet リレーショナル構造の生成」を参照してください。 |
IgnoreSchema | インライン スキーマを無視し、データを既存の DataSet スキーマへ読み込みます。既存のスキーマに一致しないデータは破棄されます。DataSet にスキーマがない場合には、データは読み込まれません。
データが DiffGram の場合、IgnoreSchema は DiffGram と同様に機能します。 |
InferSchema | インライン スキーマを無視し、XML データ構造体ごとにスキーマを推論し、データを読み込みます。
DataSet に既にスキーマが含まれている場合、現在のスキーマを拡張するため、既存のテーブルに列が追加されます。既存のテーブルがない場合には、新しいテーブルが追加されます。推論されたテーブルが他の名前空間に既に存在している場合、または推論された列と既存の列が矛盾する場合には、例外がスローされます。 ReadXmlSchema による XML ドキュメントからのスキーマの推論方法の詳細については、「XML からの DataSet リレーショナル構造の推論」を参照してください。 |
DiffGram | DiffGram を読み取り、現在のスキーマへデータを追加します。DiffGram は、既存の行に対し、固有の識別子の値が一致する新しい行を結合します。このトピックの終わりにある「XML のデータの結合」の説明を参照してください。DiffGrams の詳細については、「DiffGram」を参照してください。 |
Fragment | ストリームの終わりに達するまで、複数 XML フラグメントの読み取りを続行します。DataSet スキーマに一致するフラグメントが適切なテーブルに追加されます。DataSet スキーマに一致しないフラグメントは破棄されます。 |
**メモ **XML ドキュメントへアクセスするためのオブジェクトである ReadXml へ XmlReader を渡すと、ReadXml は次の要素ノードを読み取り、このノードをルート要素として処理し、このノードの終わりに達するまで読み取ります。ただし XmlReadMode.Fragment を指定する場合にはこれは該当しません。
DTD エンティティ
文書型定義 (DTD: Document Type Definition) スキーマで定義されているエンティティが、XML に含まれている場合に、ファイル名、ストリーム、または非検証 XmlReader を ReadXml へ渡して DataSet を読み込むと、例外がスローされます。この方法の代わりに、EntityHandling を EntityHandling.ExpandEntities に設定して XmlValidatingReader を作成し、XmlValidatingReader を ReadXml へ渡してください。XmlValidatingReader によってエンティティが展開された後で、DataSet がこのエンティティを読み取ります。
XML ストリームから DataSet を読み込むコード例を次に示します。1 番目の例では、ファイル名が ReadXml メソッドに渡されます。2 番目の例では、XML が含まれている文字列が System.IO.StringReader によって読み込まれます。
Dim myDS As DataSet = New DataSet
myDS.ReadXml("input.xml", XmlReadMode.ReadSchema)
[C#]
DataSet myDS = new DataSet();
myDS.ReadXml("input.xml", XmlReadMode.ReadSchema);
[Visual Basic]
Dim myDS As DataSet = New DataSet
Dim myTable As DataTable = New DataTable("table1")
myTable.Columns.Add("col1", Type.GetType("System.String"))
myDS.Tables.Add(myTable)
Dim xmlData As String = "<XmlDS><table1><col1>Value1</col1></table1><table1><col1>Value2</col1></table1></XmlDS>"
Dim xmlSR As System.IO.StringReader = New System.IO.StringReader(xmlData)
myDS.ReadXml(xmlSR, XmlReadMode.IgnoreSchema)
[C#]
DataSet myDS = new DataSet();
DataTable myTable = new DataTable("table1");
myTable.Columns.Add("col1", typeof(string));
myDS.Tables.Add(myTable);
string xmlData = "<XmlDS><table1><col1>Value1</col1></table1><table1><col1>Value2</col1></table1></XmlDS>";
System.IO.StringReader xmlSR = new System.IO.StringReader(xmlData);
myDS.ReadXml(xmlSR, XmlReadMode.IgnoreSchema);
メモ ReadXml を呼び出して非常に大きなファイルを読み込むと、パフォーマンスが低下することがあります。大きなファイルの場合に、ReadXml のパフォーマンスを最大にするには、DataSet のテーブルごとに DataTable.BeginLoadData メソッドを呼び出し、その後で ReadXml を呼び出します。最後に、次の例に示すように、DataSet のテーブルごとに DataTable.EndLoadData を呼び出します。
Dim t As DataTable
For Each t In ds.Tables
t.BeginLoadData()
Next
ds.ReadXml("file.xml")
For Each t in ds.Tables
t.EndLoadData()
Next
[C#]
foreach (DataTable t in ds.Tables)
t.BeginLoadData();
ds.ReadXml("file.xml");
foreach (DataTable t in ds.Tables)
t.EndLoadData();
メモ DataSet の XSD スキーマに targetNamespace が含まれている場合は、ReadXml を呼び出して、名前空間が指定されていない要素を含む XML で DataSet にデータを読み込もうとすると、読み込みは行われず、例外が発生します。この場合に、名前空間が指定されていない要素を読み込むには、XSD スキーマで elementFormDefault を "qualified" に設定します。次に例を示します。
<xsd:schema id="MyDataSet"
elementFormDefault="qualified"
targetNamespace="http://www.tempuri.org/MyDataSet.xsd"
xmlns="http://www.tempuri.org/MyDataSet.xsd"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
</xsd:schema>
XML のデータの結合
DataSet に既にデータが含まれている場合には、DataSet の既存のデータに XML の新しいデータが追加されます。ReadXml では、XML の中で主キーが一致する行情報を DataSet へ結合しません。既存の行情報を XML の新しい情報で上書きするには、ReadXml を使用して新しい DataSet を作成してから、新しい DataSet を既存の DataSet へ結合します。XmlReadMode が DiffGram の ReadXML を使用して DiffGram を読み込むと、同一の一意の識別子を持つ行が結合されます。
参照
XML と DataSet | DiffGram | XML スキーマ (XSD) からの DataSet リレーショナル構造の生成 | XML からの DataSet リレーショナル構造の推論 | XML の DataSet スキーマ情報の読み込み | Merge メソッド | DataSet の作成および使用