Laden eines "DataSets" aus XMLLoading a DataSet from XML

Der Inhalt eines ADO.NET-DataSet kann aus einem XML-Stream oder einem XML-Dokument erstellt werden.The contents of an ADO.NET DataSet can be created from an XML stream or document. Außerdem können Sie mit .NET Framework größtenteils festlegen, welche Informationen aus der XML-Quelle geladen werden sollen und wie das Schema oder die relationale Struktur des DataSet erstellt werden soll.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.

Verwenden Sie die DataSet Methode "read XML " des DataSet -Objekts, um eine mit Daten aus XML auszufüllen.To fill a DataSet with data from XML, use the ReadXml method of the DataSet object. Die Read XML -Methode liest aus einer Datei, einem Stream oder einem XmlReader-Objekt und übernimmt die Quelle des XML-Codes sowie ein optionales xmllesemode -Argument als Argumente.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. Weitere Informationen zum XmlReaderfinden Sie unter Lesen von XML-Daten mit XmlTextReader.For more information about the XmlReader, see Reading XML Data with XmlTextReader. Die Read XML -Methode liest den Inhalt des XML-Streams oder-Dokuments und DataSet lädt den mit Daten.The ReadXml method reads the contents of the XML stream or document and loads the DataSet with data. Außerdem wird das relationale Schema von DataSet erstellt, abhängig vom angegebenen xmllesemode und davon, ob ein relationales Schema bereits vorhanden ist.It will also create the relational schema of the DataSet depending on the XmlReadMode specified and whether or not a relational schema already exists.

In der folgenden Tabelle werden die Optionen für das xmllesemode -Argument beschrieben.The following table describes the options for the XmlReadMode argument.

OptionOption BeschreibungDescription
AutomatischAuto Dies ist die Standardeinstellung.This is the default. Prüft die XML-Daten und wählt die am besten geeignete Option in der folgenden Reihenfolge aus:Examines the XML and chooses the most appropriate option in the following order:

-Wenn das XML ein DiffGram ist, wird DiffGram verwendet.- If the XML is a DiffGram, DiffGram is used.
Wenn das DataSet ein Schema enthält oder das XML ein Inline Schema enthält, wird "read Schema " verwendet.- If the DataSet contains a schema or the XML contains an inline schema, ReadSchema is used.
Wenn das DataSet kein Schema enthält und das XML kein Inline Schema enthält, wird das InferSchema verwendet.- If the DataSet does not contain a schema and the XML does not contain an inline schema, InferSchema is used.

Wenn Sie das Format des gelesenen XML-Codes kennen, empfiehlt es sich, einen expliziten xmllesemodefestzulegen, anstatt den automatischen Standardwert zu akzeptieren.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 Liest beliebige Inlineschemata und lädt Daten und Schemata.Reads any inline schema and loads the data and schema.

Wenn das DataSet bereits ein Schema enthält, werden neue Tabellen aus dem Inlineschema zum vorhandenen Schema im DataSet hinzugefügt.If the DataSet already contains a schema, new tables are added from the inline schema to the existing schema in the DataSet. Wenn bereits Tabellen im Inlineschema des DataSet vorhanden sind, wird eine Ausnahme ausgelöst.If any tables in the inline schema already exist in the DataSet, an exception is thrown. Das Schema einer vorhandenen Tabelle kann nicht mithilfe von xmllesemode. Read Schemageändert werden.You will not be able to modify the schema of an existing table using XmlReadMode.ReadSchema.

Wenn das DataSet kein Schema enthält und kein Inlineschema vorhanden ist, werden keine Daten gelesen.If the DataSet does not contain a schema, and there is no inline schema, no data is read.

Ein Inlineschema kann mit dem XSD-Schema (XML Schema Definition Language) definiert werden.Inline schema can be defined using XML Schema definition language (XSD) schema. Ausführliche Informationen zum Schreiben eines Inline Schemas als XML-Schema finden Sie unter Ableiten einer relationalen DataSet-Struktur aus einem XML-Schema (XSD).For details about writing inline schema as XML Schema, see Deriving DataSet Relational Structure from XML Schema (XSD).
IgnoreSchemaIgnoreSchema Ignoriert alle Inlineschemata und lädt die Daten in das vorhandene DataSet-Schema.Ignores any inline schema and loads the data into the existing DataSet schema. Daten, die nicht mit dem vorhandenen Schema übereinstimmen, werden gelöscht.Any data that does not match the existing schema is discarded. Wenn kein Schema im DataSet vorhanden ist, werden keine Daten geladen.If no schema exists in the DataSet, no data is loaded.

Wenn es sich bei den Daten um ein DiffGram-DataSet handelt, hat ignoreschema die gleiche Funktionalität wie DiffGram .If the data is a DiffGram, IgnoreSchema has the same functionality as DiffGram .
InferSchemaInferSchema Ignoriert alle Inlineschemata, leitet das Schema aus der Struktur der XML-Daten ab und lädt anschließend die Daten.Ignores any inline schema and infers the schema per the structure of the XML data, then loads the data.

Wenn das DataSet bereits ein Schema enthält, wird das aktuelle Schema durch Hinzufügen von Spalten zu den vorhandenen Tabellen erweitert.If the DataSet already contains a schema, the current schema is extended by adding columns to existing tables. Wenn keine Tabellen vorhanden sind, werden keine zusätzlichen Tabellen hinzugefügt.Extra tables will not be added if there are not existing tables. Eine Ausnahme wird ausgelöst, wenn bereits eine hergeleitete Tabelle mit einem anderen Namespace vorhanden ist oder wenn hergeleitete Spalten mit vorhandenen Spalten kollidieren.An exception is thrown if an inferred table already exists with a different namespace, or if any inferred columns conflict with existing columns.

Ausführliche Informationen dazu, wie " infoxmlschema " ein Schema aus einem XML-Dokument ableitet, finden Sie unter ableiten der relationalen DataSet-Struktur aus XML.For details about how ReadXmlSchema infers a schema from an XML document, see Inferring DataSet Relational Structure from XML.
DiffGramDiffGram Liest ein DiffGram und fügt die Daten dem aktuellen Schema hinzu.Reads a DiffGram and adds the data to the current schema. DiffGram führt neue Zeilen mit vorhandenen Zeilen zusammen, bei denen die eindeutigen Bezeichnerwerte entsprechen.DiffGram merges new rows with existing rows where the unique identifier values match. Informationen hierzu finden Sie unter "Zusammenführen von Daten aus XML-Dokumenten" am Ende dieses Themas.See "Merging Data from XML" at the end of this topic. Weitere Informationen zu DiffGrams finden Sie unter DiffGrams.For more information about DiffGrams, see DiffGrams.
BruchFragment Setzt den Lesevorgang für mehrere XML-Fragmente fort, bis das Ende des Streams erreicht ist.Continues reading multiple XML fragments until the end of the stream is reached. Fragmente, die mit dem DataSet-Schema übereinstimmen, werden an die entsprechenden Tabellen angehängt.Fragments that match the DataSet schema are appended to the appropriate tables. Fragmente, die nicht mit dem DataSet-Schema übereinstimmen, werden gelöscht.Fragments that do not match the DataSet schema are discarded.

Hinweis

Wenn Sie einen XmlReader an ReadXml übergeben, der Teil der Art und Weise in ein XML-Dokument positioniert ist, liest ReadXml den nächsten Elementknoten und behandelt dies als Stamm Element, wobei nur bis zum Ende des Element Knotens gelesen wird.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. Dies trifft nicht zu, wenn Sie xmllesemode. Fragmentangeben.This does not apply if you specify XmlReadMode.Fragment.

DTD-EntitätenDTD Entities

Wenn Ihr XML Entitäten enthält, die in einem DTD-Schema (Document Type Definition) definiert sind, wird eine Ausnahme ausgelöst, wenn DataSet Sie versuchen, ein zu laden, indem Sie einen Dateinamen, einen Stream oder einen nicht validierenden XmlReader an die Datei " infoxml" übergeben.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. Stattdessen müssen Sie einen XmlValidatingReadererstellen, bei dem EntityHandling auf EntityHandling. ExpandEntitiesfestgelegt ist, und XmlValidatingReader an die Datei "read XML" übergeben.Instead, you must create an XmlValidatingReader, with EntityHandling set to EntityHandling.ExpandEntities, and pass your XmlValidatingReader to ReadXml. Der XmlValidatingReader erweitert die Entitäten, bevor Sie von DataSetgelesen werden.The XmlValidatingReader will expand the entities prior to being read by the DataSet.

In den folgenden Codebeispielen wird dargestellt, wie ein DataSet aus einem XML-Stream geladen wird.The following code examples show how to load a DataSet from an XML stream. Das erste Beispiel zeigt, wie ein Dateiname an die Methode "read XML " übermittelt wird.The first example shows a file name being passed to the ReadXml method. Im zweiten Beispiel wird eine Zeichenfolge mit XML-Daten mithilfe eines StringReader geladen.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);  

Hinweis

Wenn Sie " infoxml " zum Laden einer sehr großen Datei aufzurufen, kann die Leistung beeinträchtigt werden.If you call ReadXml to load a very large file, you may encounter slow performance. Um die beste Leistung für " infoxml" zu gewährleisten, müssen Sie BeginLoadData die-Methode für jede Tabelle DataSetin der abrufen und dann " infoxml" aufzurufen.To ensure best performance for ReadXml, on a large file, call the BeginLoadData method for each table in the DataSet, and then call ReadXml. Rufen Sie zum Schluss EndLoadData für jede Tabelle im DataSet auf. Dies wird im folgenden Beispiel dargestellt.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();  

Hinweis

Wenn das XSD-Schema für DataSet den einen targetNamespaceenthält, werden die Daten möglicherweise nicht gelesen, und beim Aufrufen DataSet von "read XML " zum Laden von mit XML, das Elemente ohne qualifizierenden Namespace enthält, können Ausnahmen auftreten.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. Um nicht qualifizierte Elemente in diesem Fall zu lesen, legen Sie Element Form default im XSD-Schema auf "qualified" fest.To read unqualified elements in this case, set elementFormDefault equal to "qualified" in your XSD schema. Beispiel: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>  

Zusammenführen von Daten aus XML-DokumentenMerging Data from XML

Wenn das DataSet bereits Daten enthält, werden die neuen Daten aus der XML-Quelle den im DataSet bereits vorhandenen Daten hinzugefügt.If the DataSet already contains data, the new data from the XML is added to the data already present in the DataSet. "Read XML " wird nicht aus dem XML- DataSet Code in die Zeilen Informationen mit übereinstimmenden primär Schlüsseln zusammengeführt.ReadXml does not merge from the XML into the DataSet any row information with matching primary keys. Um vorhandene Zeilen Informationen mit neuen Informationen aus XML zu überschreiben, verwenden Sie " infoxml ", um eine neue DataSetzu erstellen, DataSetund dann Merge die neue DataSet in die vorhandene.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. Beachten Sie, dass beim Laden eines DiffGram mithilfe von "read XML " mit dem xmllesemode " DiffGram " Zeilen zusammengeführt werden, die denselben eindeutigen Bezeichner aufweisen.Note that loading a DiffGram using ReadXML with an XmlReadMode of DiffGram will merge rows that have the same unique identifier.

Siehe auchSee also