Laden von DataSet-Schemainformationen aus XML

Das Schema eines DataSet (seine Tabellen, Spalten, Beziehungen und Einschränkungen) kann programmgesteuert definiert, von der Fill-Methode oder der FillSchema-Methode eines DataAdapter erstellt oder aus einem XML-Dokument geladen werden. Zum Laden von DataSet-Schemainformationen aus einem XML-Dokument können Sie entweder die ReadXmlSchema-Methode oder die InferXmlSchema-Methode des DataSet verwenden. Mit ReadXmlSchema können Sie DataSet-Schemainformationen aus dem Dokument mit dem XSD-Schema (XML Schema Definition Language) oder aus einem XML-Dokument mit einem Inline-XML-Schema laden oder herleiten. InferXmlSchema ermöglicht das Herleiten des Schemas aus dem XML-Dokument, während bestimmte von Ihnen angegebene XML-Namespaces ignoriert werden.

Hinweis

Die Tabellenreihenfolge in einem DataSet wird u. U. nicht beibehalten, wenn Sie ein DataSet, das unter Verwendung von XSD-Konstrukten (z. B. geschachtelten Beziehungen) im Arbeitsspeicher erstellt wurde, mittels Webdiensten oder XML-Serialisierung übertragen. Empfänger des DataSet sollten daher in diesem Fall keine bestimmte Tabellenreihenfolge voraussetzen. Wenn jedoch das Schema des zu übertragenden DataSet nicht im Speicher erstellt, sondern aus XSD-Dateien gelesen wird, bleibt die Tabellenreihenfolge immer erhalten.

ReadXmlSchema

Sie können die ReadXmlSchema-Methode des DataSet verwenden, um das Schema eines DataSet ohne Daten aus einem XML-Dokument zu laden. ReadXmlSchema erstellt ein DataSet-Schema, das mit dem XSD-Schema (XML Schema Definition Language) definiert wird.

Die ReadXmlSchema-Methode verwendet ein einzelnes Argument. Dabei kann es sich um den Namen einer Datei, einen Stream oder einen XmlReader mit dem zu ladenden XML-Dokument handeln. Das XML-Dokument kann nur ein Schema enthalten. Es kann aber auch ein Inlineschema mit XML-Elementen besitzen, die über Daten verfügen. Ausführliche Informationen zum Schreiben eines Inlineschemas als XML-Schema finden Sie unter Ableiten der relationalen DataSet-Struktur vom XML-Schema (XSD).

Wenn das an ReadXmlSchema übergebene XML-Dokument keine Inlineschemainformationen enthält, leitet ReadXmlSchema das Schema aus den Elementen im XML-Dokument ab. Wenn das DataSet bereits ein Schema enthält, wird das aktuelle Schema erweitert, indem neue Tabellen hinzugefügt werden, sofern diese nicht bereits vorhanden sind. Vorhandenen Tabellen werden keine neuen Spalten hinzugefügt. Wenn eine hinzuzufügende Spalte bereits im DataSet vorhanden, deren Typ aber nicht mit der im XML-Dokument gefundenen Spalte kompatibel ist, wird eine Ausnahme ausgelöst. Ausführliche Informationen dazu, wie ReadXmlSchema aus einem XML-Dokument auf ein Schema rückschließt, finden Sie unter Rückschließen der relationalen DataSet-Struktur aus XML.

Während ReadXmlSchema lediglich das Schema eines DataSet lädt oder herleitet, werden mit der ReadXml-Methode des DataSet sowohl das Schema als auch die im XML-Dokument enthaltenen Daten geladen oder hergeleitet. Weitere Informationen finden Sie unter Laden eines DataSet aus XML.

In den folgenden Codebeispielen wird gezeigt, wie ein DataSet-Schema aus einem XML-Dokument oder einem XML-Stream geladen wird. Im ersten Beispiel wird gezeigt, wie der Dateiname eines XML-Schemas an die ReadXmlSchema-Methode übergeben wird. Im zweiten Beispiel wird ein System.IO.StreamReader dargestellt.

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

Sie können das DataSet auch anweisen, sein Schema mit der InferXmlSchema-Methode des DataSet aus einem XML-Dokument abzuleiten. InferXmlSchema funktioniert wie ReadXml zusammen mit einem auf InferSchema festgelegten XmlReadMode (lädt Daten und leitet das Schema ab) und ReadXmlSchema, wenn das gelesene Dokument kein Inlineschema enthält. Allerdings haben Sie mit InferXmlSchema zusätzlich die Möglichkeit, bestimmte XML-Namespaces anzugeben, die beim Herleiten des Schemas ignoriert werden sollen. InferXmlSchema wird mit den folgenden zwei erforderlichen Argumenten verwendet: dem Speicherort des XML-Dokuments, das durch einen Dateinamen, einen Stream oder einen XmlReader angegeben wird, und einem Zeichenfolgenarray aus XML-Namespaces, die vom Vorgang ignoriert werden sollen.

Betrachten Sie beispielsweise den folgenden XML-Code:

<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>  

Aufgrund der Attribute, die für die Elemente im vorhergehenden XML-Dokument angegeben wurden, würden die ReadXmlSchema-Methode und die ReadXml-Methode (mit einem auf InferSchema festgelegten XmlReadMode) für jedes Element im Dokument Tabellen erstellen: Categories, CategoryID, CategoryName, Description, Products, ProductID, ReorderLevel und Discontinued. (Weitere Informationen finden Sie unter Ableiten der relationalen Struktur eines DataSet aus XML.) Die geeignetere Vorgehensweise bestünde jedoch darin, zunächst nur die Tabellen Categories und Products und dann die Spalten CategoryID, CategoryName und Description in der Tabelle Categories sowie die Spalten ProductID, ReorderLevel und Discontinued in der Tabelle Products zu erstellen. Damit sichergestellt wird, dass das hergeleitete Schema die in den XML-Elementen angegebenen Attribute ignoriert, geben Sie mit der InferXmlSchema-Methode an, dass der XML-Namespace für officedata ignoriert werden soll. Dies wird im folgenden Beispiel dargestellt.

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");  

Siehe auch