Il DOM XML
Microsoft ha messo a disposizione degli sviluppatori un intero namespace (System.XML) per la manipolazione dei files XML tramite il DOM, vediamo in questo articolo alcuni percorsi per operare facilmente con XML
Sempre di più XML è parte integrante del .NET Framework e in generale dei sistemi informatici, si pensi solo ai Web Services, vengono incentrati completamente su file XML per poi essere passati tramite il protocollo SOAP. Oppure si pensi ADO.NET che memorizza i dati in formato XML prima di scriverli su Database. Ancora i file di configurazione web.config e app.config sono dei file XML.
Il .NET Framework ci mette a disposizione un intero namespace il System.XML, in questo articolo esamineremo il DOM(Document Object Model), che supporta i componenti di base di livello 1 e di livello 2 del DOM definito dalla W3C. Questo è molto importante perché riusciamo a lavorare con uno standard ben definito.
Che cos?è il DOM?
Il DOM è la rappresentazione in memoria di un documento XML che ci permette di navigarlo e modificarlo.
Andiamo ad analizzare alcune delle classi del DOM:
XMLNODE
Questa è la classe astratta da cui le altre vengono estese, infatti questa classe rappresenta un nodo del file. I file hanno una struttura ad albero composta da un nodo Root e tanti nodi figli.
Il DOM viene implementato attraverso questa classe.
XMLDOCUMENT
Questa Classe rappresenta il documento XML ed estende la XmlNode e con questa classe che si carica il documento in memoria e si salvano le modifiche.
XMLNODELIST
Rappresenta una Collezione di nodi si è visto in un tips precedente la sua utilità quando si eseguono delle ricerche tramite query XPATH.
XMLELEMENT
Rappresenta un oggetto Element del documento.
XMLATTRIBUTE
Rappresenta un'oggetto attributo all'interno di un Element. Estende XMLNODE.
Vediamo più in dettaglio come lavoare con queste classi.
Poniamo l?esempio di avere questo file XML:
<?xml version="1.0" encoding="utf-8" ?>
<Anagrafica>
<Nominativo>Mario Rossi</Nominativo>
<Telefono>0612345678</Telefono>
<Indirizzo>via delle tre fontane</Indirizzo>
<citta>Roma</citta>
</Anagrafica>
Per prima cosa vogliamo leggere il valore all?interno del tag Nominativo:
VB.NET
VB.NET
Dim path As String = "Anagrafica.xml"
'istanzio il documento
Dim Doc As New XmlDocument()
'lo carico in memoria
Doc.Load(path)
'recupero il nodo root
Dim element As XmlElement = Doc.DocumentElement
'recupero il valore all'interno del primo figlio dell'elemento root
Dim node As XmlNode = element.FirstChild
MsgBox(node.InnerText)
C#
string path = "Anagrafica.xml";
//carico il file xml
XmlDocument Doc = new XmlDocument();
Doc.Load("Anagrafica.xml");
//recupero il nodo root
XmlElement element = Doc.DocumentElement;
//recupero il valore all'interno del primo figlio dell'elemento root
XmlNode node = element.FirstChild;
MessageBox.Show(node.InnerText);
Quello che viene svolto è definito nei commenti ed è piuttosto semplice ora vediamo come recuperare tutti i nodi in modo programmatico.
Quindi miglioriamo un po'il nostro esempio iterando sulla collezione di nodi dell'oggetto element:
VB.NET
Dim node As XmlNode
For Each node In element.ChildNodes
MessageBox.Show(node.InnerText)
Next
C#
foreach (XmlNode node in element.ChildNodes)
{
MessageBox.Show(node.InnerText);
}
Con questo esempio si può vedere l'importanza della classe XMLNODE che come detto prima è la base del DOM.
Ora vediamo come aggiungere un nodo.
Continuando con l'esempio:
VB.NET
Dim NodeCap As XmlNode
For Each node In element.ChildNodes
If node.Name.Equals("Indirizzo") Then
'creo il nodo
NodeCap = Doc.CreateNode(XmlNodeType.Element, "CAP", "")
'imposto il valore
NodeCap.InnerText = "00100"
'l'aggiungo al nodo indirizzo
node.AppendChild(NodeCap)
'salvo le modifiche
Doc.Save(path)
End If
Next
C#
XmlNode NodeCap;
foreach (XmlNode node in element.ChildNodes)
{
if (node.Name.Equals("Indirizzo"))
{
//creo il nodo
NodeCap = Doc.CreateNode(XmlNodeType.Element, "CAP", "");
//imposto il valore
NodeCap.InnerText ="00100";
node.AppendChild(NodeCap);
//salvo le modifiche
Doc.Save(path);
}
}
Come vedete per creare un nodo non posso richiamare il suo costruttore essendo una classe astratta, inoltre per creare un nodo si deve richiamare un metodo della XMLDOCUMENT
Doc.CreateNode(XmlNodeType.Element, "CAP", "")
Dove come primo parametro vuole il tipo di elemento da creare(questo parametro fa un riferimento all'enumerazione XmlNodeType), poi si deve passare il nome del tag(nel nostro caso CAP) e infine il namespacURI, che nel nostro caso è blank ma se c?era uno "schema" associato bisognava passarglielo.
Dopo avere creato il nodo ed impostato il valore lo aggiungo al nodo padre
node.AppendChild(NodeCap)
Infine salvo il le modifiche con il metodo Save della classe XMLDOCUMENT(Questo metodo và richiamato solo dopo aver creato o apportato tutte le modifiche al documento).
Ora il nostro file sarà così fatto:
<?xml version="1.0" encoding="utf-8" ?>
<Anagrafica>
<Nominativo>Mario Rossi</Nominativo>
<Telefono>0612345678</Telefono>
<Indirizzo>
via delle tre fontane
<CAP>00100</CAP>
</Indirizzo>
<citta>Roma</citta>
</Anagrafica>
Per ultimo aggiungiamo un'attributo all'elemento Telefono.
Recupero il nodo Telefono e aggiungo l'attributo:
VB.NET
Dim att As XmlAttribute
If node.Name.Equals("Telefono") Then
'creo l'attributo
att = Doc.CreateAttribute("TIPOLOGIA")
'imposto il valore
att.Value = "Casa"
'l'aggiungo al nodo telefono
node.Attributes.Append(att)
'salvo le modifiche
Doc.Save(path)
End If
C#
if (node.Name.Equals("Telefono"))
{
//creo l'attributo
att = Doc.CreateAttribute("TIPOLOGIA");
//imposto il valore
att.Value ="Casa";
// aggiungo l'attributo alla collezione degli attributi del nodo
node.Attributes.Append(att);
//salvo le modifiche
Doc.Save(path);
}
e il tag Telefono sarà così composto:
<Telefono TIPOLOGIA="Casa">0612345678</Telefono>
Conclusioni
Questo articolo voleva fare solo una piccola panoramica sul DOM XML visto quanto è vasto sia nelle classi che nei metodi da utilizzare e ancora di più ai vari sistemi da applicare. Ormai XML è parte integrante di tutti i prodotti Microsoft e i nuovi sistemi che stanno uscendo ne sono la testimonianza quindi conoscere al meglio il DOM è davvero importante.
Voto medio articolo: 3.7 Numero Voti: 20
Marco Caruso
Consulente Informatico di Roma, inizia la sua carriera nel 2000 utilizzando la tecnlogia Lotus Notes e il server Domino. Alla fine del 2001 passa alla piattaforma Microsoft.NET dove si appassiona sempre più a questa nuova tecnlogia. Importanti progetti a livello Enterprise per grandi società lo portano a cono...
Profilo completo