Dela via


Läsa in en DataSet från XML

Innehållet i en ADO.NET DataSet kan skapas från en XML-dataström eller ett dokument. Med .NET Framework har du dessutom stor flexibilitet när det gäller vilken information som läses in från XML och hur schemat eller relationsstrukturen DataSet för skapas.

Om du vill fylla en DataSet med data från XML använder du readxml-metoden för DataSet objektet. Metoden ReadXml läser från en fil, en dataström eller en XmlReader och tar som argument xml-källan plus ett valfritt XmlReadMode-argument . Mer information om XmlReader finns i Läsa XML-data med XmlTextReader. Metoden ReadXml läser innehållet i XML-dataströmmen eller dokumentet och läser in DataSet med data. Det skapar också relationsschemat DataSet för beroendet av angiven XmlReadMode och huruvida det redan finns ett relationsschema.

I följande tabell beskrivs alternativen för argumentet XmlReadMode .

Alternativ Description
Bil Det här är standardinställningen. Undersöker XML-koden och väljer det lämpligaste alternativet i följande ordning:

– Om XML är ett DiffGram används DiffGram .
– Om DataSet innehåller ett schema eller om XML:en innehåller ett infogat schema används ReadSchema .
– Om DataSet inte innehåller ett schema och XML inte innehåller något infogat schema används InferSchema .

Om du känner till formatet för xml-koden som läss rekommenderar vi att du anger en explicit XmlReadMode i stället för att acceptera standardinställningen Automatiskt .
ReadSchema Läser alla infogade scheman och läser in data och schema.

Om det DataSet redan innehåller ett schema läggs nya tabeller till från det infogade schemat till det befintliga schemat i DataSet. Om det redan finns några tabeller i det infogade schemat i DataSetgenereras ett undantag. Du kommer inte att kunna ändra schemat för en befintlig tabell med hjälp av XmlReadMode.ReadSchema.

DataSet Om inte innehåller ett schema, och det inte finns något infogat schema, läss inga data.

Infogat schema kan definieras med hjälp av XSD-schema (XML Schema Definition Language). Mer information om hur du skriver infogat schema som XML-schema finns i Härleda datauppsättningens relationsstruktur från XML-schema (XSD).
IgnoreSchema Ignorerar alla infogade scheman och läser in data i det befintliga DataSet schemat. Alla data som inte matchar det befintliga schemat ignoreras. Om det inte finns något schema i DataSetläses inga data in.

Om data är ett DiffGram har IgnoreSchema samma funktioner som DiffGram .
InferSchema Ignorerar alla infogade scheman och härleder schemat enligt STRUKTUREN för XML-data och läser sedan in data.

Om det DataSet redan innehåller ett schema utökas det aktuella schemat genom att kolumner läggs till i befintliga tabeller. Extra tabeller läggs inte till om det inte finns befintliga tabeller. Ett undantag utlöses om en uppskjuten tabell redan finns med ett annat namnområde, eller om några uppskjutna kolumner står i konflikt med befintliga kolumner.

Mer information om hur ReadXmlSchema härleder ett schema från ett XML-dokument finns i Härleda DataSet Relationsstruktur från XML.
DiffGram Läser ett DiffGram och lägger till data i det aktuella schemat. DiffGram sammanfogar nya rader med befintliga rader där de unika identifierarvärdena matchar. Se "Slå samman data från XML" i slutet av det här avsnittet. Mer information om DiffGrams finns i DiffGrams.
Fragment Fortsätter att läsa flera XML-fragment tills dataströmmens slut har nåtts. Fragment som matchar DataSet schemat läggs till i lämpliga tabeller. Fragment som inte matchar DataSet schemat ignoreras.

Kommentar

Om du skickar en XmlReader till ReadXml som är placerad en del av vägen i ett XML-dokument läser ReadXml till nästa elementnod och behandlar den som rotelementet och läser endast till slutet av elementnoden. Detta gäller inte om du anger XmlReadMode.Fragment.

DTD-entiteter

Om xml-koden innehåller entiteter som definierats i ett schema för dokumenttypsdefinition (DTD), utlöses ett undantag om du försöker läsa in en DataSet genom att skicka ett filnamn, en dataström eller ett icke-verifierande XmlReader till ReadXml. I stället måste du skapa en XmlValidatingReader med EntityHandling inställt på EntityHandling.ExpandEntiteter och skicka xmlValidatingReader till ReadXml. XmlValidatingReader expanderar entiteterna innan de DataSetläss av .

Följande kodexempel visar hur du läser in en från en DataSet XML-dataström. I det första exemplet visas ett filnamn som skickas till metoden ReadXml . Det andra exemplet visar en sträng som innehåller XML som läses in med hjälp av en 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);  

Kommentar

Om du anropar ReadXml för att läsa in en mycket stor fil kan det uppstå långsamma prestanda. För att säkerställa bästa prestanda för ReadXml anropar BeginLoadData du metoden för varje tabell i DataSetoch anropar sedan ReadXml i en stor fil. EndLoadData Anropa slutligen för varje tabell i DataSet, som du ser i följande exempel.

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

Kommentar

Om XSD-schemat för ditt DataSet innehåller ett targetName-utrymme kanske data inte läses, och du kan stöta på undantag när du anropar ReadXml för att läsa in DataSet med XML som innehåller element utan kvalificerande namnområde. Om du vill läsa okvalificerade element i det här fallet anger du elementFormDefault lika med "kvalificerad" i XSD-schemat. Till exempel:

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

Slå samman data från XML

Om de DataSet redan innehåller data läggs de nya data från XML till i de data som redan finns i DataSet. ReadXml sammanfogas inte från XML till DataSet någon radinformation med matchande primära nycklar. Om du vill skriva över befintlig radinformation med ny information från XML använder du ReadXml för att skapa en ny DataSetoch sedan Merge den nya DataSet i den befintliga DataSet. Observera att om du läser in ett DiffGram med Hjälp av ReadXML med en XmlReadMode av DiffGram sammanfogas rader som har samma unika identifierare.

Se även