NSXmlParser il default XmlParser di iOS

Per chi lavora da molto con la programmazione, sia Java che .Net, avere a disposizione un Dom per la lettura dei files xml tramite un documento a grafo e magari espressioni xpath, è oramai legge.

Eppure per lavorare su IPhone tramite iOS e in generale su Mac OSX, di default troviamo solo ed esclusivamente un SaxParser, l’NSXmlParser..

Superato l’impatto delle Sax (da sempre ostiche ma sicuramente molto performanti), facciamo un velocissimo esempio di come usarle in una nostra classe, per leggere velocemente dei dati da un file xml.

Innanzitutto aggiungiamo l’interfaccia  NSXMLParserDelegate alla classe che riceverà gli eventi Sax, perche le Sax lavorano completamente ad eventi. Quando verrà lanciato il parser, scatteranno eventi ogni volta che si verificherà una condizione (aperto nodo, presenza testo, chiuso nodo, etc etc etc )

1
@interface MiaClasse : NSObject <NSXMLParserDelegate>

 

in questa classe (che può essere una qualsiasi classe del nostro progetto, dichiariamo l’xml parser nell’header , l’elemento che conterrà l’array di dati che andiamo ad estrarre, i puntatori per i singoli valori (on the fly come variabili secche, ma in genere meglio definire un oggetto Item che esponga tutti gli attributi), il puntatore all’elemento xml corrente che il parser sta analizzando:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@interface MiaClasse : NSObject <NSXMLParserDelegate>

//parser

NSXMLParser *xmlParser;

//array che conterrà i dati

NSMutableArray *elencoItems;

//variabile temporanea per ogni elemento

NSMutableDictionary *item;// nome del nodo corrente che il sax parser sta analizzando

NSString *currentElement;

//elementi che leggeremo e poi memorizzeremo

NSMutableString *nome, *cognome, *indirizzo;

ora che abbiamo definito l’header, passiamo all’implementazione.

Inizializziamo il parser e l’array di dati nel metodo in cui lo andiamo ad usare, nel costruttore o dove vogliamo.

In questo caso andiamo a leggere il file xml da risorsa locale, ma possiamo accedere tranquillamente ad un file remoto .

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
- (void)applicationDidFinishLaunching:(UIApplication *)application {

elencoItems= [[NSMutableArray alloc] init];

xmlParser = [[NSXMLParser alloc] initWithData:[NSData dataWithContentsOfFile:[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"test.xml"]  ]];

//definiamo il delegato che riceverà gli eventi (in questo caso la classe stessa

[xmlParser setDelegate:self];

//saltiamo i problemi di namespace

[xmlParser setShouldProcessNamespaces:NO];

[xmlParser setShouldReportNamespacePrefixes:NO];

[xmlParser setShouldResolveExternalEntities:NO];

// avviamo il parsing XML

[xmlParser parse];

}

 

ora definiamo i metodi essenziali per soddisfare l’interfaccia NSXMLParserDelegate:

didStartElement , che viene eseguito ad ogni inizio di elemento xml trovato

didEndElement, che viene eseguito quando viene analizzata la chiusura di un tag xml

foundCharacters, che viene eseguito quando si analizza il contenuto di tipo “text” di un elemento

parserDidEndDocument, che scatta quando si raggiunge la fine del documento xml.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{

currentElement = [elementName copy];

//qui mettiamo tutte le regole di match del nostro xml, ad esempio cosa fare quando

// si incontra un nodo denominato "persona"

if ([elementName isEqualToString:@"persona"]) {

// inizializza tutti gli elementi che conterranno i dati. memorizzeremo ogni item come tabella per praticità

item = [[NSMutableDictionary alloc] init];

nome = [[NSMutableString alloc] init];

cognome = [[NSMutableString alloc] init];

indirizzo = [[NSMutableString alloc] init];

}

}

 

Nel metodo didEndElement andremo fisicamente a prendere i dati letti e a memorizzarli in una struttura (il nostro array)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{

if ([elementName isEqualToString:@"persona"]) {

[item setObject:nome forKey:@"nome"];

[item setObject:cognome forKey:@"cognome"];

[item setObject:indirizzo forKey:@"indirizzo"];

[elencoItems addObject:[item copy]];

}

}

 

Ed ora il metodo che fisicamente legge i dati dai nodi:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {

if ([currentElement isEqualToString:@"nome"]){

[nome appendString:string];

} else if ([currentElement isEqualToString:@"cognome"]) {

[cognome appendString:string];

} else if ([currentElement isEqualToString:@"indirizzo"]) {

[indirizzo appendString:string];

} }

 

Infine se a termine del traversing del grafo xml dobbiamo effettuare delle operazioni, come prendere il risultato e passarlo ad altri oggetti, utilizziamo il parserDidEndDocument:

1
2
3
4
5
6
7
- (void)parserDidEndDocument:(NSXMLParser *)parser {

[mioOggetti setData:elencoItems];

[elencoItems release];

}

In linea di massima e’ molto semplice utilizzare XmlParser.

Come tutti i framework e metodologie su iOS si fa un grande uso dei delegati.

Spero di esservi stato di aiuto.

 

Worms of the earth – Traian’s Tower Falls

Nono pezzo del disco..

pezzo a cui sono particolarmente legato. La musica doveva far parte di un mio album che non ha mai preso vita e continuamente saccheggiato e cannibalizzato per questo disco 🙂

 

Il viaggio o la fuga di Bran lo portano ai confini della brughiera, da dove può vedere la Torre di Traiano, simbolo di Roma, e sede militare di Tito Silla.. E’ un simbolo.. il simbolo dell’avanzata romana.

Watching from the moor
i can’t see the traian’s tower
standing fierce like a standard on the hill
cloud of dust precludes my sight

 

Ma c’e’ qualcosa di strano, e’ lo stesso Bran ad avvertirlo.. La torre.. non e’ piu li.. non si staglia più fiera all’orizzonte come uno stendardo.. una nuvola di polvere oscura la sua vista..

 

Mined from below
Thousands worms that work in darkness
Romans hear their noise
Time is come to face their Haughtiness

Scavata dalle profondità, migliaia di vermi hanno lavorato nell’oscurità per minarne le fondamentà..

I romani per tutto il giorno sentirono quei rumori.. ma non ci prestarono attenzione..Nulla poteva toccarli..

 

E la torre crolla impietosa.. le pietre si sgretolano..

e Bran arrivato alle rovine, tra le macerie,  va alla ricerca di Tito Silla, lasciato in fin di vita dai Vermi della Terra.. sul suo trono.. pallido in volto, oramai senza piu speranze…

I had thought to give this stroke in Vengeance
I give it in mercy….VALE CAESAR…

Bran riflette , su come immaginava la sua vendetta, e si rende conto che si trova li, e sta finendo Tito Silla, non piu per vendetta, ma per Pietà..

E il suo cuore vacilla, e’ qui che inizia fermamente a pensare all’abominio che aveva scatenato sulla Terra, affinche fosse compiuta la sua vendetta..

Da notare che il Vale Cesare latino , in questo frangente viene erroneamente in Inglese.

La voce di Bran Mac Morn è di Giuseppe Orlando.

 

 

Worms of the earth – The Black Stone

Ottavo pezzo del disco.

In questo brano , l’attenzione si sposta sul feticcio adorato dai vermi, la pietra nera caduta dal cielo di R’Lyeh.

Inizia con un esortazione, la mente di bran che gli suggerisce cosa fare..

Drop down the dagon’s lake

and see it falling to the hell

Drop down the dagon’s lake

and wait………………..

Gettala nel lago di Dagon e guardala sprofondare all’inferno.. Gettala nel lago di Dagon e attendi..

L’unico posto dove nascondere la pietra, senza che i vermi la ritrovino, e’ nel lago di Dagon, dimora dell’antico dio.. Solo li i Vermi non oseranno cercarla..

Qui poi la scena si sposta, e inquadra una scena di vita romana nell’accampamento di Eboracum, un momento trascorso, i Romani che si trovano dinanzi ai Menhir, e impauriti dalle costruzioni, vengono rassicurati .. La loro costruzione non e’ poi cosi antica, ed e’ stata effettuata dai Druidi.. Bugia del governatore di allora, Caio..  Quei Cerchi di pietre sono stati posizionati migliaia di anni fa, dalla razza serpente, dai vermi della terra.. Una scena che sta a indicare il misticismo e le paure ancestrali di una terra oscura e affascinante, la scozia..

The Menhir the Ancient druids built them

Romans are sure, believing in the words of Caio

The Power Circles are signs left from thousands years ago

The reptile race,that you awake, reclaming power….

 

 

Subdue by Stone subdue by the warrior-king

The ancient race is coming out from the hell

Bounded by relic feld from the sky of rl’yeah

Give them the stone, they will accomplish your fate

 

 

Sottomessi dalla pietra, sottomessi dal re guerriero, l’antica razza viene fuori dall’inferno.. Vincolati dalla reliquia caduta dal cielo di R’Lyeh.. Dagli la pietra e loro compieranno il tuo destino..

 

Got the Black Stone

Hold the Black Stone

Hide the Black Stone Bran..

Through the Gates to Abominium

Ancient idol fall

 

Il Ritornello sta a ricordare la parte centrale e l’azione fondamentale di bran..Prendi la pietra, trattieni la pietra nascondi la pietra Bran.. Attraverso i cancelli che portano all’abominio, l’antico idolo cade..

 

Qui poi il pezzo si apre.. Uno spaccato dell’avanzata romana sul vallo di adriano, come a spiegare la nascita dell’odio di Bran verso l’invasore Romano…

Legion after Legion

Centurions advancing

Dethroning you…

the king of caledonian tribes

Legione dopo Legione i centurioni avanzano.. Detronizzando te, il Re delle Tribu di Caledonia.

 

They kill your brothers

the smell of blood refill the air

Villages are burning

The Crying of the Pictish men

 

Uccidono i tuoi fratelli, l’odore del sangue riempie l’aria.. I Villaggi bruciano, ascolta il pianto degli uomini pitti..

Gladius after Gladius

The picts are falling to the ground

your haste and hate cann’t wait until the morning sun

Unleash the power of the black stone in your hands

Release the power of the worms of the Earth…

Gladio dopo Gladio, i pitti cadono in terra.. Il tuo odio e la tua rabbia non possono attendere fino al prossimo sorgere del sole..

Libera il potere della pietra nera nelle te mani.. Rilascia il potere dei Vermi della Terra..

Qui la furia dei vermi parte .. La loro rabbia cieca, come i loro occhi, devasterà la Torre di Traiano, e tutti i suoi occupanti..