- Muoversi in un file XML -
 
COSA SERVE PER QUESTO TUTORIAL
Download | Chiedi sul FORUM | Glossario un compilatore per vb.net
Muoversi in un albero XML con System.Xml.XmlDocument e XmlElement

MUOVERSI IN UN FILE XML
Alcune semplici e utili funzioni per agire su un file XML.

Vediamo come, attraverso lo spazio di nomi System.Xml, ci si possa muovere agilmente all'interno dell'albero di un file XML.
Per prima cosa è necessario creare un oggetto System.Xml.XmlDocument che rappresenterà l'intero file XML con tutte le sue caratteristiche:


Dim xmlDocument As New Xml.XmlDocument()
xmlDocument.Load(strFileLocation)

Nella riga appena sopra, attraverso il metodo Load con parametro il percorso completo del file XML, diamo istruzione di controllare la validità del documento e quindi di caricarlo in memoria.
La prima funzione che andiamo ad analizzare è GetElementById: attraverso di essa è possibile ottenere un oggetto XmlElement che rappresenta la tag nel documento XML con l'ID specificato:

Dim elmCustomer As Xml.XmlElement = xmlDocument.GetElementById(strCustomerID)

Attenzione: per ID non si intende semplicemente un attributo di nome ID ma un attributo che sia definito nel DTD del file XML come ID, infatti all'interno del DOCTYPE di customers.xml troviamo

<!ATTLIST customer ID ID #REQUIRED>

dove il primo ID indica il nome dell'attributo mentre il secondo il tipo, ovvero un identificatore univoco.
Quindi se ad esempio si richiamasse

xmlDocument.GetElementById("C100")

verrebbe restituito un riferimento al tag

<customer ID="C100">

In alternativa a GetElementById è spesso utile utilizzare GetElementsByTagName, funzione che restituisce una lista di oggetti XmlElement formata da tutte le tag con il nome specificato:

Dim elmNameInfo As Xml.XmlElement = elmCustomer.GetElementsByTagName("name").Item(0)

In questo caso si è certi che vi è un solo elemento di nome "name", per questo è stato specificato di restituire un riferimento al primo (e unico) della lista. Nel caso vi fossero più tag con lo stesso nome, per analizzarle una ad una è sufficiente farle ciclare man mano incrementando l'indice (che nell'esempio sopra è 0) fino a

elmCustomer.GetElementsByTagName("name").Count

che indica il totale di tag con quel nome. GetElementById e GetElementsByTagName sono disponibili sia attraverso l'oggetto XmlElement che XmlDocument, nel primo caso limitando la ricerca ai nodi figlio del tag corrente.
XmlElement espone inoltre il metodo GetAttribute che restituisce il valore di un attributo della tag in questione prendendo come parametro il nome dell'attributo stesso:


Console.WriteLine("Nome: " & elmNameInfo.GetAttribute("first"))
Console.WriteLine("Cognome: " & elmNameInfo.GetAttribute("surname"))

Infine XmlElement fornisce un'altra proprietà molto interessante: ChildNodes. Essa restituisce la lista degli elementi figli di quello corrente, che è possibile enumerare come segue (e come anche già spiegato per GetElementsByTagName):


Dim C1 As Integer
For C1 = 0 To elmItems.ChildNodes.Count - 1
    Console.WriteLine(elmItems.ChildNodes(C1).InnerText)
Next C1

Se si nota, in questo ultimo esempio è stata utilizzata la proprietà InnerText di XmlElement: essa restituisce il testo puro (quindi privo di tag XML) contenuto nell'elemento in questione.

 

<< INDIETRO by VeNoM00