Sommario:
Questo tutorial illustrerà innanzitutto come gestire (creare, modificare, leggere) un file XML e come sia possibile manipolarlo con estrama facilità. Nella seconda parte verrà mostrato come poter utilizzare i file XML come semplici database.
Questo tutorial utilizza esempi in linguaggio VB.Net e quindi, conseguentemente, le informazioni qui riporate valgono anche per la tecnologia ASP.Net. Anche se non vi sono esempi in C#, la natura ad oggetti del Framework .Net rende di facile stesura la traduzione di tutto il codice da VB.Net a C#.
Cominciamo subito con un esempio pratico. Supponiamo di voler utilizzare un file XML come file di configurazione di una nostra applicazione scritta in Visual Basic .Net. Supponiamo quindi di aver creato (dopo vedremo come fare) il seguente file ed averlo chiamato Settings.xml.
<?xml version="1.0" standalone="yes"?>
<Settings>
<SistemaUtente>
<SistemaOperativo>Windows XP Professional</SistemaOperativo>
<CartellaApplicazione>C:\Programmi\Esempio</CartellaApplicazione>
<CartellaPlugins>C:\Programmi\Esempio\Plugins</CartellaPlugins>
<CartellaDocumenti>D:\MyDocuments</CartellaDocumenti>
</SistemaUtente>
<InterfacciaGrafica>
<ColoreSfondo>Green</ColoreSfondo>
<DimensioneOrizzontale>550</DimensioneOrizzontale>
<DimensioneVerticale>400</DimensioneVerticale>
<VisualizzazioneAvanzata>True</VisualizzazioneAvanzata>
</InterfacciaGrafica>
</Settings>
In questo file di esempio vi è memorizzato il sistema operativo dell'utente, la cartella in cui gira la nostra applicazione e altre informazioni sul sistema. Vi sono inoltre memorizzate alcune impostazioni scelte dall'utente come il colore dello sfondo del nostro programma o il tipo di modalità scelta (avanzata o no). Insomma è un tipico file di impostazioni, con la differenza che è scritto in XML.
Nota: per cominciare a seguire questi primi esempi (in cui non ho ancora spiegato come creare da codice un file come quello dell'esempio), potete crearlo con un semplice editor di testo copiando e incollandolo da questa pagina e poi salvarlo come "Settings.xml".
Cominciamo a vedere come leggerne i contenuti. Innanzitutto dobbiamo dichiarare un oggetto DataSet, che ci permetterà di interagire con il nostro file XML. Lo facciamo in questo modo:
Dim ds As New Data.DataSet
A questo punto possiamo caricare nel DataSet la struttura e i dati del file XML in questo modo:
ds.ReadXml(Application.StartupPath + "\Settings.xml")
Il metodo ReadXml() carica nel controllo DataSet la struttura e i dati del file XML. Da questo momento in poi potremmo leggere i dati caricati nel DataSet. Un importante nota da fare è che il controllo DataSet è un contenitore di dati "disconnesso", nel senso che non c'è una connessione real time tra il controllo DataSet e il file XML. Questa significa che se noi carichiamo il file XML nel DataSet col metodo ReadXml() e, successivamente, il file XML viene modificato da un processo diverso, questa modifica non si rispecchierà nel controllo DataSet.
Ora che nel DataSet vi sono la struttura e i dati del file Settings.xml, possiamo leggerne le informazioni, come nelle istruzioni successive:
Dim SO As String = ds.Tables("SistemaUtente").Rows(0).Item("SistemaOperativo")
Dim Avanzato As Boolean = ds.Tables("InterfacciaGrafica").Rows(0).Item("VisualizzazioneAvanzata")
Possiamo anche modificarne i valori, in questo modo:
ds.Tables("InterfacciaGrafica").Rows(0).Item("VisualizzazioneAvanzata") = False
Dato che abbiamo detto che il DataSet è un componente disconnesso dai dati, dobbiamo ricordarci che le modifiche apportate alla struttura e ai dati nel DataSet, non avranno riscontro nel file XML sull'hard disk; questo almeno finche non si eseguirà l'istruzione
ds.WriteXml(Application.StartupPath + "\Settings.xml")
che scriverà ex-novo il file XML sull'hard disk, di fatto aggiornandolo con le modifiche da noi effettuate.
L'esempio successivo mostra come creare un file XML da codice. Vedremo dopo qualque spiegazione.
Dim ds As New Data.DataSet
ds.DataSetName = "NuovoDataSet"
ds.Tables.Add("NuovaTabella")
ds.Tables("NuovaTabella").Columns.Add("Colonna1")
ds.Tables("NuovaTabella").Columns.Add("Colonna2")
ds.Tables("NuovaTabella").Columns.Add("Colonna3")
Dim rowVals(2) As String 'Vettore che conterrà i valori da memorizzare nella riga
rowVals(0) = "Valore1"
rowVals(1) = "Valore2"
rowVals(2) = "Valore3"
ds.Tables("NuovaTabella").Rows.Add(rowVals)
ds.WriteXml(Application.StartupPath + "\NuovoXML.xml")
Praticamente, dopo aver creato un oggetto DataSet (1a istruzione) gli abbiamo assegnato un nome. Questo sarà il nome della base dati che conterrà le informazioni. Corrisponde al <Settings> dell'esempio precedente. Successivamente abbiamo aggiunto prima una tabella di nome NuovaTabella (corrispondente a <SistemaUtente> o <InterfacciaGrafica> dell'esempio precedente) e abbiamo poi aggiunto 3 campi (colonne).
Ci siamo quindi preparati in un array di stringhe dei valori che abbiamo poi inserito in una nuova riga (penultima istruzione). Infine abbiamo salvato i dati e la struttura del DataSet in un file di nome NuovoXML.xml (operazione sempre necessaria per creare o modificare il file sull'hard disk). Il file risultante dalle operazioni precedenti è il seguente:
<?xml version="1.0" standalone="yes"?>
<NuovoDataSet>
<NuovaTabella>
<Colonna1>Valore1</Colonna1>
<Colonna2>Valore2</Colonna2>
<Colonna3>Valore3</Colonna3>
</NuovaTabella>
</NuovoDataSet>
Se necessario, avremmo anche potuto eliminare una colonna, in questo modo:
ds.Tables("NuovaTabella").Columns.Remove("Colonna2")
Avrete notato nel paragrafo precedente, che parlando di file XML (o del corrispettivo in memoria centrale, il DataSet), ho utilizzato termini come "Tabella", "Colonna" o "Riga". Questa terminologia ci fa pensare subito ad un database. Questo in effetti non è errato. Possiamo infatti pensare ad un file XML come ad un semplice Database composto solo di tabelle, righe e colonne (senza cioè relazioni, transazioni o altre cose tipiche dei database).
Immaginiamo, ad esempio, un database di nome "NomeDatabase" composto da due tabelle di nome, rispettivamente, "NomeTabella1" e "NomeTabella2"; la prima tabella è composta da 4 campi, mentre la seconda da 5; la prima tabella è riempita con 3 righe, mentre la seconda con una sola. La situazione appena descritta si tradurrebbe in un file XML di questo tipo:
<?xml version="1.0" standalone="yes"?>
<NomeDatabase>
<NomeTabella1>
<NomeCampo1>Valore</NomeCampo1>
<NomeCampo2>Valore</NomeCampo2>
<NomeCampo3>Valore</NomeCampo3>
<NomeCampo4>Valore</NomeCampo4>
</NomeTabella1>
<NomeTabella1>
<NomeCampo1>Valore</NomeCampo1>
<NomeCampo2>Valore</NomeCampo2>
<NomeCampo3>Valore</NomeCampo3>
<NomeCampo4>Valore</NomeCampo4>
</NomeTabella1>
<NomeTabella1>
<NomeCampo1>Valore</NomeCampo1>
<NomeCampo2>Valore</NomeCampo2>
<NomeCampo3>Valore</NomeCampo3>
<NomeCampo4>Valore</NomeCampo4>
</NomeTabella1>
<NomeTabella2>
<NomeCampo1>Valore</NomeCampo1>
<NomeCampo2>Valore</NomeCampo2>
<NomeCampo3>Valore</NomeCampo3>
<NomeCampo4>Valore</NomeCampo4>
<NomeCampo5>Valore</NomeCampo5>
</NomeTabella2>
</NomeDatabase>
Il fatto che i tag <NomeTabella1> e </NomeTabella1> siano ripetuti tre volte significa appunto che nella tabella NomeTabella1 vi sono presenti tre righe.
Nota: Per creare un Database in XML come questo appena visto si può utilizzare quanto illustrato nel paragrafo precedente oppure crearlo con un editor di testo.
Vediamo ora come sia possibile navigare all'interno del nostro database XML. Come al solito lo facciamo con un esempio.
Dim ds As New Data.DataSet
Dim i As Integer
ds.ReadXml(Application.StartupPath + "\Data.xml")
'Eseguo una iterazione per ogni riga presente nella tabella
For i = 0 To ds.Tables("NomeTabella1").Rows.Count - 1
'Visualizzo un messaggio per ogni valore letto
MsgBox(ds.Tables("NomeTabella1").Rows(i).Item("NomeCampo1"))
Next
Non credo che questo codice abbia bisogno di commenti, per cui ve lo lascio così com'è. Prima di concludere aggiungiungo solamente che nell'utilizzo di file XML come database, può essere necessario dover eliminare una riga da una tabella oppure una tabella intera. Ecco come:
'Elimina la riga numero 3 (la quarta)
ds.Tables("NuovaTabella").Rows(3).Delete()
'Elimina una tabella
ds.Tables.Remove("NuovaTabella")
Questo tutorial ti è piaciuto o ti è stato utile? Scrivimi e dimmi cosa ne pensi. Mi incoraggerai a scriverne altri..