Een DataSet laden vanuit XML
De inhoud van een ADO.NET DataSet kan worden gemaakt op basis van een XML-stroom of -document. Bovendien hebt u met .NET Framework veel flexibiliteit ten opzichte van welke gegevens uit XML worden geladen en hoe het schema of de relationele structuur van de DataSet database wordt gemaakt.
Als u een DataSet bestand wilt vullen met gegevens uit XML, gebruikt u de ReadXml-methode van het DataSet object. De ReadXml-methode leest uit een bestand, een stroom of xmlReader en neemt als argumenten de bron van de XML plus een optioneel XmlReadMode-argument. Zie XML-gegevens lezen met XmlTextReader voor meer informatie over xmlReader. De ReadXml-methode leest de inhoud van de XML-stroom of het DOCUMENT en laadt de DataSet met gegevens. Het maakt ook het relationele schema van het DataSet afhankelijk van de opgegeven XmlReadMode en of er al dan niet een relationeel schema bestaat.
In de volgende tabel worden de opties voor het argument XmlReadMode beschreven.
Optie | Omschrijving |
---|---|
Auto | Dit is de standaardinstelling. Bekijkt de XML en kiest de meest geschikte optie in de volgende volgorde: - Als de XML een DiffGram is, wordt DiffGram gebruikt. - Als het DataSet een schema bevat of de XML een inlineschema bevat, wordt ReadSchema gebruikt. - Als het DataSet geen schema bevat en de XML geen inlineschema bevat, wordt InferSchema gebruikt. Als u de indeling van de XML kent die wordt gelezen, is het raadzaam om voor de beste prestaties een expliciete XmlReadMode in te stellen in plaats van de standaardwaarde automatisch te accepteren. |
ReadSchema | Leest een inlineschema en laadt de gegevens en het schema. Als het DataSet al een schema bevat, worden nieuwe tabellen vanuit het inlineschema toegevoegd aan het bestaande schema in de DataSet. Als er al tabellen in het inlineschema bestaan, DataSetwordt er een uitzondering gegenereerd. U kunt het schema van een bestaande tabel niet wijzigen met xmlReadMode.ReadSchema. Als het DataSet geen schema bevat en er geen inlineschema is, worden er geen gegevens gelezen. Inlineschema kan worden gedefinieerd met behulp van het XSD-schema (XML Schema Definition Language). Zie Voor meer informatie over het schrijven van een inlineschema als XML-schema, gegevensset relationele structuur afleiden van XML-schema (XSD). |
IgnoreSchema | Negeert een inlineschema en laadt de gegevens in het bestaande DataSet schema. Alle gegevens die niet overeenkomen met het bestaande schema, worden verwijderd. Als er geen schema in het DataSetschema bestaat, worden er geen gegevens geladen. Als de gegevens een DiffGram zijn, heeft IgnoreSchema dezelfde functionaliteit als DiffGram. |
InferSchema | Negeert een inlineschema en afgeleid het schema volgens de structuur van de XML-gegevens en laadt vervolgens de gegevens. Als het DataSet al een schema bevat, wordt het huidige schema uitgebreid door kolommen toe te voegen aan bestaande tabellen. Er worden geen extra tabellen toegevoegd als er geen bestaande tabellen zijn. Er wordt een uitzondering gegenereerd als er al een uitgestelde tabel bestaat met een andere naamruimte of als er uitgestelde kolommen conflicteren met bestaande kolommen. Zie Relationele structuur van DataSet uit XML afleiden voor meer informatie over hoe ReadXmlSchema een schema van een XML-document afstelt. |
DiffGram | Hiermee leest u een DiffGram en voegt u de gegevens toe aan het huidige schema. DiffGram voegt nieuwe rijen samen met bestaande rijen waarbij de unieke id-waarden overeenkomen. Zie 'Gegevens samenvoegen vanuit XML' aan het einde van dit onderwerp. Zie DiffGrams voor meer informatie over DiffGrams. |
Fragment | Gaat verder met het lezen van meerdere XML-fragmenten totdat het einde van de stream is bereikt. Fragmenten die overeenkomen met het DataSet schema, worden toegevoegd aan de juiste tabellen. Fragmenten die niet overeenkomen met het DataSet schema, worden verwijderd. |
Notitie
Als u een XmlReader doorgeeft aan ReadXml die deel van de weg naar een XML-document heeft geplaatst, wordt ReadXml gelezen naar het volgende elementknooppunt en wordt dit behandeld als het hoofdelement, waarbij alleen wordt gelezen tot het einde van het elementknooppunt. Dit geldt niet als u XmlReadMode.Fragment opgeeft.
DTD-entiteiten
Als uw XML entiteiten bevat die zijn gedefinieerd in een DTD-schema (documenttypedefinitie), wordt er een uitzondering gegenereerd als u probeert een DataSet bestand te laden door een bestandsnaam, stream of niet-geldige XmlReader door te geven aan ReadXml. In plaats daarvan moet u een XmlValidatingReader maken, waarbij EntityHandling is ingesteld op EntityHandling.ExpandEntities en uw XmlValidatingReader doorgeven aan ReadXml. De XmlValidatingReader breidt de entiteiten uit voordat ze worden gelezen door de DataSet.
In de volgende codevoorbeelden ziet u hoe u een bestand DataSet laadt vanuit een XML-stream. In het eerste voorbeeld ziet u een bestandsnaam die wordt doorgegeven aan de ReadXml-methode . In het tweede voorbeeld ziet u een tekenreeks die XML bevat die wordt geladen met behulp van een 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);
Notitie
Als u ReadXml aanroept om een zeer groot bestand te laden, kunnen er trage prestaties optreden. Als u de beste prestaties voor ReadXml wilt garanderen, roept u op een groot bestand de BeginLoadData methode aan voor elke tabel in de DataSettabel en roept u vervolgens ReadXml aan. Roep ten slotte EndLoadData aan voor elke tabel in de DataSettabel, zoals wordt weergegeven in het volgende voorbeeld.
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();
Notitie
Als het XSD-schema voor uw doelnaamruimte bevat, worden gegevens mogelijk niet gelezen en kunnen er uitzonderingen optreden wanneer u ReadXml aanroept om de DataSet xml te laden met elementen zonder in aanmerking DataSet komende naamruimte. Als u in dit geval niet-gekwalificeerde elementen wilt lezen, stelt u elementFormDefault in dat gelijk is aan 'gekwalificeerd' in uw XSD-schema. Voorbeeld:
<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>
Gegevens uit XML samenvoegen
Als de DataSet al gegevens bevat, worden de nieuwe gegevens uit de XML toegevoegd aan de gegevens die al aanwezig zijn in de DataSet. ReadXml wordt niet samengevoegd vanuit de XML in de DataSet rijgegevens met overeenkomende primaire sleutels. Als u bestaande rijgegevens met nieuwe informatie uit XML wilt overschrijven, gebruikt u ReadXml om een nieuwe DataSette maken en vervolgens Merge de nieuwe DataSet in de bestaandeDataSet. Als u een DiffGram laadt met behulp van ReadXML met een XmlReadMode van DiffGram , worden rijen met dezelfde unieke id samengevoegd.