Freigeben über


Laden von DataSet-Schemainformationen aus XML

Das Schema einer DataSet (Tabellen, Spalten, Beziehungen und Einschränkungen) kann programmgesteuert definiert, durch die Fill- oder FillSchema-Methoden eines DataAdapter oder aus einem XML-Dokument geladen werden. Um Schemainformationen aus einem XML-Dokument zu laden DataSet , können Sie entweder die ReadXmlSchema Methode oder die InferXmlSchema Methode des DataSet verwenden. ReadXmlSchema ermöglicht das Laden oder Ableiten DataSet von Schemainformationen aus einem Dokument, das die XML-Schema-Definition (XSD) enthält, oder aus einem XML-Dokument mit einem Inline-XML-Schema. InferXmlSchema ermöglicht es Ihnen, das Schema aus dem XML-Dokument abzuleiten, während bestimmte von Ihnen angegebene XML-Namespaces ignoriert werden.

Hinweis

Die Tabellensortierung in einem DataSet wird möglicherweise nicht beibehalten, wenn Sie Webdienste oder XML-Serialisierung verwenden, um ein im Arbeitsspeicher mit XSD-Konstrukten (z. B. geschachtelte Beziehungen) erstelltes DataSet zu übertragen. Daher sollte der Empfänger von DataSet in diesem Fall nicht von der Tabellenreihenfolge abhängen. Die Tabellenordnung wird jedoch immer beibehalten, wenn das Schema der DataSet übertragenen Datei aus XSD-Dateien gelesen wurde, anstatt im Arbeitsspeicher erstellt zu werden.

ReadXmlSchema

Um das Schema eines DataSet aus einem XML-Dokument zu laden, ohne jegliche Daten zu laden, können Sie die ReadXmlSchema-Methode des DataSet verwenden. ReadXmlSchema erstellt DataSet ein Schema, das mithilfe des XSD-Schemas (XML Schema Definition Language) definiert ist.

Die ReadXmlSchema Methode verwendet ein einzelnes Argument eines Dateinamens, eines Datenstroms oder eines XmlReader xml-Dokuments, das geladen werden soll. Das XML-Dokument kann nur ein Schema enthalten oder ein Schema inline mit XML-Elementen enthalten, die Daten enthalten. 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, wird ReadXmlSchema das Schema aus den Elementen im XML-Dokument ableiten. Wenn das DataSet bereits ein Schema enthält, wird das aktuelle Schema erweitert, indem neue Tabellen hinzugefügt werden, sofern sie noch nicht vorhanden sind. Vorhandenen Tabellen werden keine neuen Spalten hinzugefügt. Wenn eine hinzugefügte Spalte bereits im DataSet XML-Code vorhanden ist, aber einen inkompatiblen Typ mit der Spalte enthält, die im XML-Code gefunden wurde, wird eine Ausnahme ausgelöst. Ausführliche Informationen dazu, wie ReadXmlSchema ein Schema aus einem XML-Dokument abgeleitet wird, finden Sie unter Inferring DataSet Relational Structure from XML.

Obwohl ReadXmlSchema nur das Schema eines DataSet lädt oder ableitet, lädt oder leitet die ReadXml Methode der DataSet sowohl das Schema als auch die im XML-Dokument enthaltenen Daten ab. Weitere Informationen finden Sie unter Laden eines DataSets aus XML.

Die folgenden Codebeispiele zeigen, wie ein DataSet Schema aus einem XML-Dokument oder -Stream geladen wird. Das erste Beispiel zeigt einen XML-Schemadateinamen, der an die ReadXmlSchema Methode übergeben wird. Das zweite Beispiel zeigt einen 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

Sie können das DataSet Schema auch mithilfe der InferXmlSchema Methode des DataSet aus einem XML-Dokument ableiten. InferXmlSchema funktioniert genauso wie sowohl ReadXml mit einem XmlReadMode von InferSchema (lädt Daten und schließt auf das Schema) und ReadXmlSchema, falls das zu lesende Dokument kein Inlineschema enthält. Bietet jedoch die zusätzliche Möglichkeit, bestimmte XML-Namespaces anzugeben, InferXmlSchema die ignoriert werden sollen, wenn das Schema abgeleitet wird. InferXmlSchema akzeptiert zwei erforderliche Argumente: den Speicherort des XML-Dokuments, angegeben durch einen Dateinamen, einen Datenstrom oder einen XmlReader; und ein Zeichenfolgenarray von XML-Namespaces, die vom Vorgang ignoriert werden sollen.

Betrachten Sie z. B. die folgende XML:For example, consider the following 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>

Aufgrund der Attribute, die für die Elemente im vorherigen XML-Dokument angegeben wurden, würden sowohl die ReadXmlSchema Methode als auch die ReadXml Methode mit einem XmlReadMode von InferSchema tabellen für jedes Element im Dokument erstellt werden: Categories, CategoryID, CategoryName, Description, Products, ProductID, ReorderLevel und Discontinued. (Weitere Informationen finden Sie unter Inferring DataSet Relational Structure from XML.) Eine geeignetere Struktur wäre jedoch, nur die Tabellen Categories und Products zu erstellen und dann die Spalten CategoryID, CategoryName und Description in der Categories Tabelle sowie die Spalten ProductID, ReorderLevel und Discontinued in der Products Tabelle zu erstellen. Um sicherzustellen, dass das abgeleitete Schema die in den XML-Elementen angegebenen Attribute ignoriert, verwenden Sie die InferXmlSchema Methode, und geben Sie den XML-Namespace an, um officedata ignoriert zu werden, wie im folgenden Beispiel gezeigt.

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