XML からの DataSet の読み込みLoading a DataSet from XML

ADO.NET では、XML ストリームまたは XML ドキュメントから DataSet の内容を作成できます。The contents of an ADO.NET DataSet can be created from an XML stream or document. また、.NET Framework では、XML から読み込まれる情報と DataSet のスキーマまたはリレーショナル構造の作成方法を柔軟に変更できます。In addition, with the .NET Framework you have great flexibility over what information is loaded from XML, and how the schema or relational structure of the DataSet is created.

に XML のDataSetデータを格納するには、 DataSetオブジェクトの ReadXml メソッドを使用します。To fill a DataSet with data from XML, use the ReadXml method of the DataSet object. ReadXmlメソッドは、ファイル、ストリーム、またはXmlReaderから読み取り、XML のソースと省略可能なXmlReadMode引数を引数として受け取ります。The ReadXml method reads from a file, a stream, or an XmlReader, and takes as arguments the source of the XML plus an optional XmlReadMode argument. XmlReaderの詳細については、「 XmlTextReader を使用した XML データの読み取り」を参照してください。For more information about the XmlReader, see Reading XML Data with XmlTextReader. ReadXmlメソッドは、XML ストリームまたはドキュメントの内容を読み取り、データDataSetを使用してを読み込みます。The ReadXml method reads the contents of the XML stream or document and loads the DataSet with data. また、指定されたXmlReadModeと、 DataSetリレーショナルスキーマが既に存在するかどうかに応じて、のリレーショナルスキーマも作成されます。It will also create the relational schema of the DataSet depending on the XmlReadMode specified and whether or not a relational schema already exists.

次の表では、 XmlReadMode引数のオプションについて説明します。The following table describes the options for the XmlReadMode argument.

オプションOption 説明Description
AutoAuto 既定値です。This is the default. XML を調べ、次の順序で最適なオプションを選択します。Examines the XML and chooses the most appropriate option in the following order:

-XML が DiffGram の場合は、 diffgramが使用されます。- If the XML is a DiffGram, DiffGram is used.
-にDataSetスキーマが含まれている場合、または XML にインラインスキーマが含まれている場合は、 readschemaが使用されます。- If the DataSet contains a schema or the XML contains an inline schema, ReadSchema is used.
-にDataSetスキーマが含まれておらず、XML にインラインスキーマが含まれていない場合は、 InferSchemaが使用されます。- If the DataSet does not contain a schema and the XML does not contain an inline schema, InferSchema is used.

読み取り中の XML の形式がわかっている場合は、最適なパフォーマンスを得るために、自動既定値をそのまま使用するのではなく、明示的なXmlReadModeを設定することをお勧めします。If you know the format of the XML being read, for best performance it is recommended that you set an explicit XmlReadMode, rather than accept the Auto default.
ReadSchemaReadSchema インライン スキーマを読み取り、データとスキーマを読み込みます。Reads any inline schema and loads the data and schema.

DataSet に既にスキーマが含まれている場合には、読み取るインライン スキーマの新しいテーブルが DataSet の既存のスキーマに追加されます。If the DataSet already contains a schema, new tables are added from the inline schema to the existing schema in the DataSet. インライン スキーマのテーブルが既に DataSet に存在している場合には、例外がスローされます。If any tables in the inline schema already exist in the DataSet, an exception is thrown. XmlReadModeを使用して、既存のテーブルのスキーマを変更することはできません。You will not be able to modify the schema of an existing table using XmlReadMode.ReadSchema.

DataSet にスキーマが含まれておらず、インライン スキーマが存在しない場合には、データは読み取られません。If the DataSet does not contain a schema, and there is no inline schema, no data is read.

インライン スキーマを定義するには、XML スキーマ定義言語 (XSD) スキーマを使用します。Inline schema can be defined using XML Schema definition language (XSD) schema. インラインスキーマを XML スキーマとして記述する方法の詳細については、「 Xml スキーマ (XSD) からの DataSet リレーショナル構造の派生」を参照してください。For details about writing inline schema as XML Schema, see Deriving DataSet Relational Structure from XML Schema (XSD).
IgnoreSchemaIgnoreSchema インライン スキーマを無視し、データを既存の DataSet スキーマへ読み込みます。Ignores any inline schema and loads the data into the existing DataSet schema. 既存のスキーマに一致しないデータは破棄されます。Any data that does not match the existing schema is discarded. DataSet にスキーマがない場合には、データは読み込まれません。If no schema exists in the DataSet, no data is loaded.

データが DiffGram の場合、 IgnoreSchemaにはdiffgramと同じ機能があります。If the data is a DiffGram, IgnoreSchema has the same functionality as DiffGram .
InferSchemaInferSchema インライン スキーマを無視し、XML データ構造ごとにスキーマを推論し、データを読み込みます。Ignores any inline schema and infers the schema per the structure of the XML data, then loads the data.

DataSet に既にスキーマが含まれている場合、既存のテーブルに列を追加することによって現在のスキーマが拡張されます。If the DataSet already contains a schema, the current schema is extended by adding columns to existing tables. 既存のテーブルが存在しない場合、余分なテーブルは追加されません。Extra tables will not be added if there are not existing tables. 推論されたテーブルが他の名前空間に既に存在している場合、または推論された列と既存の列が矛盾する場合には、例外がスローされます。An exception is thrown if an inferred table already exists with a different namespace, or if any inferred columns conflict with existing columns.

Readxmlschemaが xml ドキュメントからスキーマを推論する方法の詳細については、「 Xml からの DataSet リレーショナル構造の推論」を参照してください。For details about how ReadXmlSchema infers a schema from an XML document, see Inferring DataSet Relational Structure from XML.
DiffGramDiffGram DiffGram を読み取り、現在のスキーマへデータを追加します。Reads a DiffGram and adds the data to the current schema. DiffGramでは、一意の識別子の値が一致する既存の行と新しい行がマージされます。DiffGram merges new rows with existing rows where the unique identifier values match. このトピックの最後にある「XML のデータの結合」の説明を参照してください。See "Merging Data from XML" at the end of this topic. Diffgram の詳細については、「 Diffgram グラム」を参照してください。For more information about DiffGrams, see DiffGrams.
抜粋Fragment ストリームの終わりに達するまで、複数 XML フラグメントの読み取りを続行します。Continues reading multiple XML fragments until the end of the stream is reached. DataSet スキーマに一致するフラグメントが適切なテーブルに追加されます。Fragments that match the DataSet schema are appended to the appropriate tables. DataSet スキーマに一致しないフラグメントは破棄されます。Fragments that do not match the DataSet schema are discarded.

注意

XML ドキュメントに配置されているreadxmlXmlReaderを渡すと、 readxmlは次の要素ノードを読み取り、それをルート要素として扱い、要素ノードの最後まで読み取ります。If you pass an XmlReader to ReadXml that is positioned part of the way into an XML document, ReadXml will read to the next element node and will treat that as the root element, reading until the end of the element node only. XmlReadModeを指定した場合、この設定は適用されません。This does not apply if you specify XmlReadMode.Fragment.

DTD エンティティDTD Entities

XML にドキュメント型定義 (DTD) スキーマで定義されているエンティティが含まれている場合、ファイル名、ストリームDataSet 、または非検証XmlReaderReadXmlに渡すことによってを読み込もうとすると、例外がスローされます。If your XML contains entities defined in a document type definition (DTD) schema, an exception will be thrown if you attempt to load a DataSet by passing a file name, stream, or non-validating XmlReader to ReadXml. 代わりに、 EntityhandlingEntityhandling. expandentitiesに設定して、 XmlValidatingReaderReadXmlに渡す必要があります。Instead, you must create an XmlValidatingReader, with EntityHandling set to EntityHandling.ExpandEntities, and pass your XmlValidatingReader to ReadXml. XmlValidatingReaderは、 DataSetによって読み取られる前にエンティティを拡張します。The XmlValidatingReader will expand the entities prior to being read by the DataSet.

XML ストリームから DataSet を読み込むコード サンプルを次に示します。The following code examples show how to load a DataSet from an XML stream. 最初の例は、 ReadXmlメソッドに渡されるファイル名を示しています。The first example shows a file name being passed to the ReadXml method. 2 番目の例では、XML が含まれている文字列が StringReader によって読み込まれます。The second example shows a string that contains XML being loaded using a StringReader.

Dim dataSet As DataSet = New DataSet  
dataSet.ReadXml("input.xml", XmlReadMode.ReadSchema)  
DataSet dataSet = new DataSet();  
dataSet.ReadXml("input.xml", XmlReadMode.ReadSchema);  
Dim dataSet As DataSet = New DataSet  
Dim dataTable As DataTable = New DataTable("table1")  
dataTable.Columns.Add("col1", Type.GetType("System.String"))  
dataSet.Tables.Add(dataTable)  
  
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)  
  
dataSet.ReadXml(xmlSR, XmlReadMode.IgnoreSchema)  
DataSet dataSet = new DataSet();  
DataTable dataTable = new DataTable("table1");  
dataTable.Columns.Add("col1", typeof(string));  
dataSet.Tables.Add(dataTable);  
  
string xmlData = "<XmlDS><table1><col1>Value1</col1></table1><table1><col1>Value2</col1></table1></XmlDS>";  
  
System.IO.StringReader xmlSR = new System.IO.StringReader(xmlData);  
  
dataSet.ReadXml(xmlSR, XmlReadMode.IgnoreSchema);  

注意

ReadXmlを呼び出して非常に大きなファイルを読み込むと、パフォーマンスが低下する可能性があります。If you call ReadXml to load a very large file, you may encounter slow performance. Readxmlで最適なパフォーマンスを得るには、大きなファイルで、 BeginLoadDataDataSet各テーブルに対してメソッドを呼び出し、 readxmlを呼び出します。To ensure best performance for ReadXml, on a large file, call the BeginLoadData method for each table in the DataSet, and then call ReadXml. 最後に、次の例に示すように、EndLoadData のテーブルごとに DataSet を呼び出します。Finally, call EndLoadData for each table in the DataSet, as shown in the following example.

Dim dataTable As DataTable  
  
For Each dataTable In dataSet.Tables  
   dataTable.BeginLoadData()  
Next  
  
dataSet.ReadXml("file.xml")  
  
For Each dataTable in dataSet.Tables  
   dataTable.EndLoadData()  
Next  
foreach (DataTable dataTable in dataSet.Tables)  
   dataTable.BeginLoadData();  
  
dataSet.ReadXml("file.xml");   
  
foreach (DataTable dataTable in dataSet.Tables)  
   dataTable.EndLoadData();  

注意

DataSet XSD スキーマにtargetNamespaceが含まれている場合は、 ReadXmlを呼び出して、 DataSet修飾された名前空間を持たない要素を含む XML を読み込むと、データが読み取られず、例外が発生する可能性があります。If the XSD schema for your DataSet includes a targetNamespace, data may not be read, and you may encounter exceptions, when calling ReadXml to load the DataSet with XML that contains elements with no qualifying namespace. この場合、修飾されていない要素を読み取るには、XSD スキーマでelementFormDefaultを "qualified" に設定します。To read unqualified elements in this case, set elementFormDefault equal to "qualified" in your XSD schema. 例:For example:

<xsd:schema id="customDataSet"   
  elementFormDefault="qualified"  
  targetNamespace="http://www.tempuri.org/customDataSet.xsd"   
  xmlns="http://www.tempuri.org/customDataSet.xsd"   
  xmlns:xsd="http://www.w3.org/2001/XMLSchema"   
  xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">  
</xsd:schema>  

XML のデータの結合Merging Data from XML

既に、DataSet にデータが含まれている場合には、DataSet の既存のデータに XML の新しいデータが追加されます。If the DataSet already contains data, the new data from the XML is added to the data already present in the DataSet. ReadXmlでは、XML から、一致するDataSet主キーを持つ行情報にはマージされません。ReadXml does not merge from the XML into the DataSet any row information with matching primary keys. 既存の行情報を XML の新しい情報で上書きするには、 ReadXmlDataSet使用してMerge新しいを作成したDataSet後、 DataSet既存のに新しいを作成します。To overwrite existing row information with new information from XML, use ReadXml to create a new DataSet, and then Merge the new DataSet into the existing DataSet. XmlReadModediffgramReadXMLを使用して diffgram を読み込むと、同じ一意の識別子を持つ行がマージされることに注意してください。Note that loading a DiffGram using ReadXML with an XmlReadMode of DiffGram will merge rows that have the same unique identifier.

関連項目See also