Technology Experience

Contenuti gestiti da Igor Damiani
posts - 949, comments - 2741, trackbacks - 15120

My Links

News

  • Questo blog si propone di raccogliere riflessioni, teoriche e pratiche, su tutto quello che riguarda il world-computing che mi sta attorno: programmazione in .NET, software attuale e futuro, notizie provenienti dal web, tecnologia in generale, open-source.

    L'idea è quella di lasciare una sorta di patrimonio personale, una raccolta di idee che un giorno potrebbe farmi sorridere, al pensiero di dov'ero e cosa stavo facendo.

    10/05/2005,
    Milano

Archives

Post Categories

Generale

[70-526, #4] Leggere un documento XML con XmlReader

Al contrario di quanto abbiamo fatto nei due post precedenti (1 e 2), questa volta vedremo come aprire un documento XML in modalità read-only attraverso l'utilizzo della classe XmlReader. Questo oggetto non carica tutto il documento XML in memoria, ma fornisce un veloce reader forward-only per leggere tutti i nodi del documento. Dimenticatevi quindi di poter saltare liberamente avanti ed indietro all'interno del documento: con XmlReader si guarda solo in avanti. :-) L'istanziazione passa attraverso un metodo statico Create, che dispone di ben 12 overload che permettono di leggere un documento da file, da uno Stream e da un TextReader ed utilizzando in certi casi un'istanza di XmlReaderSettings (vedere questo articolo per dettagli). Nel più semplice dei casi avremo quindi una chiamata come questa:

string xmlFilename = "E:\\Books.xml"; using (XmlReader reader = XmlReader.Create(xmlFilename)) { }

La classe XmlReader implementa l'interfaccia IDisposable, perciò, fate un favore ai bytes che compongono il vostro software (tutto compreso: dalle celle al CLR): includetela in un blocco using per rilasciare le risorse appena finito il lavoro con il vostro documento XML. :-)

Il file XML Books.xml a cui si fa riferimento è stato creato attraverso la classe XmlDocument di cui abbiamo già parlato ieri. Una volta istanziato e creato il reader XML, utilizziamo il metodo Read che salta di nodo in nodo addentrandosi in profondità nel grafo XML seguendone ovviamente la struttura. Il metodo Read ritorna false quando si è arrivati alla fine del documento; lo stesso risultato è esposto dalla proprietà EOF. Possiamo quindi implementare una banale iterazione che vada ad esplorare tutti i nodi del documento utilizzando un ciclo while, come riportato qui sotto:

while (reader.Read()) { }

Ad ogni iterazione, l'oggetto reader espone tutte le informazioni relative al nodo corrente. La proprietà NodeType per esempio esprime attraverso un enum XmlNodeType il tipo del nodo corrente. La proprietà Depth ci dice a quale livello di profondità ci troviamo all'interno del documento XML. La proprietà HasAttributes ci dice se il nodo corrente ha oppure no degli attributi.

Ovviamente, esplorare un documento XML senza poterne leggere il contenuto ha poco senso. A questo scopo, XmlReader espone una serie di metodi riconoscibili dal prefisso ReadElementContentAs + qualcosa, dove qualcosa vuol dire Int, Boolean, DateTime, String, Double, Float e così via. In questo modo, evitiamo un casting che viene invece effettuato dal FW. In altre parole, invece di essere letto come stringa, viene letto con il tipo di dato più coerente per il contesto. Un esempio concreto: utilizzando sempre il documento XML mostrato qui, possiamo intercettare la lettura del tag <year>1998</year> e salvare in un oggetto int il valore dell'anno.

string nodeName = reader.LocalName; if (nodeName.Equals("year")) { year = reader.ReadElementContentAsInt(); Console.WriteLine("Anno : " + year.ToString()); }

Ho inserito questo blocco di codice nel ciclo while mostrato prima. Ad ogni iterazione, controllo il nome dell'elemento su cui mi trovo. Quando il nome del tag è "year", allora posso leggere il contenuto del tag direttamente castandolo ad intero. Esiste un metodo ReadElementContentAs per ogni tipo di dato, ovviamente. Possiamo eventualmente usare il metodo ReadElementContentAs per leggere il contenuto di un tag specificando il Type corretto.

Al di là dello spostarsi nel documento con il metodo Read, possiamo utilizzare altri metodi più efficaci e più specifici in base al contesto. Se un certo elemento ha uno o più attributi, possiamo usare MoveToFirstAttribute e MoveToNextAttribute. Non hanno bisogno di parametri, ritornano true se l'operazione ha avuto successo, altrimenti false. Il metodo MoveToAttribute è un po' più selettivo: come parametri accetta in input un Int32 o una string per indicare a quale attributo spostarsi.

Se volete skippare tutti i nodi fino a quando non ne trovate uno con un particolare tag, utilizzate il metodo ReadToFollowing che accetta una stringa che fa avanzare l'XmlReader fino al punto desiderato. Se volete skippare tutti i nodi fino al nodo "fratello" di quello corrente (un altro nodo alla stessa profondità con lo stesso nome di tag) utilizzate il metodo ReadToNextSibling.

La classe XmlNodeReader è una classe derivata da XmlReader, che ne specializza il comportamento permettendo la navigazione di un singolo nodo (XmlNode).

Print | posted on mercoledì 10 gennaio 2007 18:01 | Filed Under [ Esame 70-526 ]

Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET