Caricamento di un DataSet da XML

È possibile creare i contenuti di un DataSet di ADO.NET da un flusso o un documento XML. .NET Framework consente inoltre di definire con grande flessibilità le informazioni da caricare da XML e la modalità di creazione dello schema o struttura relazionale del DataSet.

Per riempire un DataSet con dati provenienti da XML, utilizzare il metodo ReadXml dell'oggetto DataSet. Il metodo ReadXml consente di leggere un file, un flusso o un XmlReader e accetta come argomenti l'origine del documento XML, oltre a un argomento XmlReadMode facoltativo. Per ulteriori informazioni su XmlReader, vedere Lettura dei dati XML mediante XmlTextReader. Il metodo ReadXml consente di leggere i contenuti del flusso o del documento XML e di caricare tali dati nel DataSet. Tale metodo consente inoltre la creazione dello schema relazionale del DataSet sulla base del XmlReadMode specificato e dell'eventuale esistenza di uno schema relazionale.

Nella tabella seguente vengono elencate le opzioni disponibili per l'argomento XmlReadMode.

XmlReadMode Descrizione
Auto Si tratta dell'impostazione predefinita. Consente di esaminare il documento o flusso XML e di selezionare l'opzione più appropriata, nel seguente ordine:
  • Se il documento o flusso XML è un DiffGram, viene utilizzato DiffGram.
  • Se nel DataSet è presente uno schema o nel documento o flusso XML è presente uno schema inline, viene utilizzato ReadSchema.
  • Se nel DataSet non è presente alcuno schema o nel documento o flusso XML non è presente alcuno schema inline, viene utilizzato InferSchema.

Se si dispone di informazioni sul formato del documento o flusso XML letto, per ottimizzare le prestazioni si consiglia di impostare un XmlReadMode esplicito, anziché utilizzare l'impostazione predefinita Auto.

ReadSchema Consente di leggere gli schemi inline e di caricare i dati e lo schema.

Se nel DataSet è già presente uno schema, vengono aggiunte nuove tabelle dallo schema inline allo schema esistente nel DataSet. Se delle tabelle dello schema inline sono già presenti nel DataSet, viene generata un'eccezione. Non sarà possibile modificare lo schema di una tabella esistente utilizzando XmlReadMode.ReadSchema.

Se nel DataSet non è presente alcuno schema e non si dispone di alcuno schema inline, non verrà letto alcun dato.

È possibile definire lo schema inline utilizzando lo schema XSD (Schema Definition Language) di XML. Per informazioni sulla scrittura di uno schema inline come schema XML, vedere Generazione della struttura relazionale di un DataSet dallo schema XML (XSD).

IgnoreSchema Consente di ignorare eventuali schemi inline e di caricare i dati nello schema di DataSet esistente. Eventuali dati non corrispondenti allo schema esistente vengono eliminati. Se nel DataSet non è presente alcuno schema, non verrà caricato alcun dato.

Se i dati sono costituiti da un DiffGram, IgnoreSchema avrà la stessa funzionalità di DiffGram.

InferSchema Consente di ignorare eventuali schemi inline e di inferire uno schema in base alla struttura dei dati XML, che vengono quindi caricati.

Se nel DataSet è già presente uno schema, lo schema corrente verrà esteso tramite l'aggiunta di nuove tabelle, nel caso in cui non sia presente alcuna tabella, o tramite l'aggiunta di colonne alle tabelle esistenti. Se esiste già una tabella inferita con spazio dei nomi diverso o se alcune colonne inferite entrano in conflitto con le colonne esistenti, verrà generata un'eccezione.

Per informazioni sulla modalità di inferenza dello schema da un documento XML da parte di ReadXmlSchema, vedere Inferenza della struttura relazionale del DataSet da XML.

DiffGram Consente di leggere un DiffGram e di aggiungere i dati allo schema corrente. Tramite DiffGram nuove righe vengono unite a righe esistenti in caso di corrispondenza dei valori dell'identificatore univoco. Vedere la nota relativa a "Unione di dati da XML" alla fine di questo argomento. Per ulteriori informazioni sui DiffGram, vedere DiffGram.
Fragment Consente di continuare a leggere più frammenti XML fino al raggiungimento della fine del flusso. I frammenti corrispondenti allo schema del DataSet vengono aggiunti alle tabelle appropriate. I frammenti non corrispondenti allo schema DataSet vengono eliminati.

**Nota   **Se si passa un XmlReader a un ReadXml posizionato in un punto di un documento XML, ReadXml leggerà il nodo successivo dell'elemento e lo considererà come elemento principale, leggendo solo fino alla fine del nodo dell'elemento. Questo comportamento non si verifica se si specifica XmlReadMode.Fragment.

Entità DTD

Se nel documento XML sono presenti entità definite in uno schema DTD (Document Type Definition), verrà generata un'eccezione nel caso in cui si tenti di caricare un DataSet passando un nome file, un flusso o un XmlReader che non effettua conferma a ReadXml. È invece necessario creare un XmlValidatingReader, con EntityHandling impostato su EntityHandling.ExpandEntities e passare tale XmlValidatingReader a ReadXml. Le entità verranno espanse da XmlValidatingReader prima di essere lette dal DataSet.

Nel seguente esempio di codice viene illustrato il caricamento di un DataSet da un flusso XML. Nel primo esempio viene mostrato il passaggio di un nome file al metodo ReadXml. Nel secondo esempio viene mostrato il caricamento di una stringa contenente XML tramite System.IO.StringReader.

Dim myDS As DataSet = New DataSet
myDS.ReadXml("input.xml", XmlReadMode.ReadSchema)
[C#]
DataSet myDS = new DataSet();
myDS.ReadXml("input.xml", XmlReadMode.ReadSchema);
[Visual Basic]
Dim myDS As DataSet = New DataSet
Dim myTable As DataTable = New DataTable("table1")
myTable.Columns.Add("col1", Type.GetType("System.String"))
myDS.Tables.Add(myTable)

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)

myDS.ReadXml(xmlSR, XmlReadMode.IgnoreSchema)
[C#]
DataSet myDS = new DataSet();
DataTable myTable = new DataTable("table1");
myTable.Columns.Add("col1", typeof(string));
myDS.Tables.Add(myTable);

string xmlData = "<XmlDS><table1><col1>Value1</col1></table1><table1><col1>Value2</col1></table1></XmlDS>";

System.IO.StringReader xmlSR = new System.IO.StringReader(xmlData);

myDS.ReadXml(xmlSR, XmlReadMode.IgnoreSchema);

Nota   Se si chiama ReadXml per caricare un file di grandi dimensioni, può verificarsi una riduzione delle prestazioni. Per ottenere le massime prestazioni quando si utilizza ReadXml con file di grandi dimensioni, chiamare il metodo DataTable.BeginLoadData per ciascuna tabella del DataSet, quindi chiamare ReadXml. Chiamare infine DataTable.EndLoadData per ogni tabella del DataSet, come mostrato nell'esempio che segue.

Dim t As DataTable

For Each t In ds.Tables
  t.BeginLoadData()
Next

ds.ReadXml("file.xml")

For Each t in ds.Tables
  t.EndLoadData()
Next
[C#]
foreach (DataTable t in ds.Tables)
  t.BeginLoadData();

ds.ReadXml("file.xml"); 

foreach (DataTable t in ds.Tables)
  t.EndLoadData();

**Nota   **Se lo schema XML di un DataSet include un targetNamespace, è possibile che non si riesca a leggere i dati e che si verifichino eccezioni quando si chiama ReadXml per caricare il DataSet con un XML che contiene elementi privi di uno spazio dei nomi qualificativo. In questo caso, per leggere elementi non qualificati, impostare elementFormDefault su "qualified" nello schema XSD. Esempio:

<xsd:schema id="MyDataSet" 
  elementFormDefault="qualified"
  targetNamespace="http://www.tempuri.org/MyDataSet.xsd" 
  xmlns="http://www.tempuri.org/MyDataSet.xsd" 
  xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
  xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
</xsd:schema>

Unione di dati da XML

Se nel DataSet sono già presenti dati, i nuovi dati provenienti dal flusso o dal documento XML vengono aggiunti ai dati esistenti nel DataSet. Eventuali informazioni di riga con chiavi primarie corrispondenti presenti nel flusso o documento XML non vengono unite da ReadXml nel DataSet. Per sovrascrivere le informazioni esistenti con le nuove informazioni provenienti da XML, utilizzare ReadXml per creare un nuovo DataSet, quindi effettuare un'operazione di Unione del nuovo DataSet e del DataSet esistente. Si noti che il caricamento di un DiffGram tramite ReadXML con XmlReadMode pari a DiffGram consentirà di unire righe a cui è associato lo stesso identificatore univoco.

Vedere anche

XML e il DataSet | DiffGram | Generazione della struttura relazionale di un DataSet dallo schema XML (XSD) | Inferenza della struttura relazionale del DataSet da XML | Caricamento delle informazioni relative allo schema di un DataSet da XML | Metodo DataSet.Merge | Creazione e utilizzo di DataSet