Delen via


Gegevenssetschemagegevens laden uit XML

Het schema van een DataSet (tabellen, kolommen, relaties en beperkingen) kan programmatisch worden gedefinieerd, gemaakt door de methoden Fill of FillSchema van een DataAdapter, of geladen vanuit een XML-document. Als u Gegevensset-schemagegevens uit een XML-document wilt laden, kunt u het ReadXmlSchema of de Methode InferXmlSchema van de DataSet gebruiken. Met ReadXmlSchema kunt u Gegevensset-schemagegevens laden of afleiden uit het document met een XSD-schema (XML Schema Definition Language) of een XML-document met een inline XML-schema. Met InferXmlSchema kunt u het schema afleiden uit het XML-document terwijl u bepaalde XML-naamruimten negeert die u opgeeft.

Notitie

Tabelvolgorde in een DataSet blijft mogelijk niet behouden wanneer u webservices of XML-serialisatie gebruikt om een DataSet over te dragen die in het geheugen is gemaakt met behulp van XSD-constructies (zoals geneste relaties). Daarom mag de ontvanger van de DataSet niet afhankelijk zijn van tabelvolgorde in dit geval. Tabelvolgorde blijft echter altijd behouden als het schema van de gegevensset die wordt overgedragen, is gelezen uit XSD-bestanden, in plaats van dat het in het geheugen wordt gemaakt.

ReadXmlSchema

Als u het schema van een DataSet wilt laden vanuit een XML-document zonder gegevens te laden, kunt u de methode ReadXmlSchema van de DataSet gebruiken. ReadXmlSchema maakt een DataSet-schema dat is gedefinieerd met het XSD-schema (XML Schema Definition Language).

De methode ReadXmlSchema gebruikt één argument van een bestandsnaam, een stroom of een XmlReader met het XML-document dat moet worden geladen. Het XML-document kan alleen een schema bevatten of kan een schema inline bevatten met XML-elementen die gegevens bevatten. Zie Voor meer informatie over het schrijven van een inlineschema als XML-schema, gegevensset relationele structuur afleiden van XML-schema (XSD).

Als het XML-document dat is doorgegeven aan ReadXmlSchema geen inlineschemagegevens bevat, leidt ReadXmlSchema het schema af van de elementen in het XML-document. Als de DataSet al een schema bevat, wordt het huidige schema uitgebreid door nieuwe tabellen toe te voegen als deze nog niet bestaan. Nieuwe kolommen worden niet toegevoegd aan bestaande tabellen. Als een kolom die wordt toegevoegd al bestaat in de DataSet , maar een niet compatibel type heeft met de kolom die in de XML is gevonden, wordt er een uitzondering gegenereerd. Zie Relationele structuur van DataSet uit XML afleiden voor meer informatie over hoe ReadXmlSchema een schema van een XML-document afstelt.

Hoewel ReadXmlSchema alleen het schema van een DataSet laadt of afstelt, worden met de ReadXml-methode van de DataSet zowel het schema als de gegevens in het XML-document geladen of afgeleid. Zie Een gegevensset laden vanuit XML voor meer informatie.

In de volgende codevoorbeelden ziet u hoe u een DataSet-schema laadt vanuit een XML-document of -stream. In het eerste voorbeeld ziet u een XML-schemabestandsnaam die wordt doorgegeven aan de methode ReadXmlSchema . In het tweede voorbeeld ziet u een 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

U kunt de DataSet ook instrueren om het schema van een XML-document af te leiden met behulp van de methode InferXmlSchema van de DataSet. InferXmlSchema werkt hetzelfde als zowel ReadXml met een XmlReadMode van InferSchema (laadt gegevens evenals het schema afleiden) en ReadXmlSchema als het document dat wordt gelezen geen inlineschema bevat. InferXmlSchema biedt echter de extra mogelijkheid om bepaalde XML-naamruimten op te geven die moeten worden genegeerd wanneer het schema wordt afgeleid. InferXmlSchema heeft twee vereiste argumenten: de locatie van het XML-document, opgegeven door een bestandsnaam, een stroom of een XmlReader; en een tekenreeksmatrix van XML-naamruimten die door de bewerking moeten worden genegeerd.

Denk bijvoorbeeld aan de volgende 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>  

Vanwege de kenmerken die zijn opgegeven voor de elementen in het voorgaande XML-document, zouden zowel de methode ReadXmlSchema als de methode ReadXml met een XmlReadMode van InferSchema tabellen maken voor elk element in het document: Categorieën, CategoryID, CategoryName, Beschrijving, Producten, ProductID, ReorderLevel en Stopgezet. (Zie voor meer informatie Relationele structuur van DataSet uit XML uitstellen.) Een meer geschikte structuur is echter om alleen de tabellen Categorieën en Producten te maken en vervolgens de kolommen CategoryID, CategoryName en Description te maken in de tabel Categorieën, en Kolommen ProductID, ReorderLevel en Stopgezette kolommen in de tabel Producten. Als u ervoor wilt zorgen dat het afgeleid schema de kenmerken negeert die zijn opgegeven in de XML-elementen, gebruikt u de methode InferXmlSchema en geeft u de XML-naamruimte voor officedata op die moet worden genegeerd, zoals wordt weergegeven in het volgende voorbeeld.

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

Zie ook