Parsing XML di elementi e attributi con TouchXML

Assumendo che tu abbia già familiarità con il parsing di documenti XML passerò direttamente al punto in questione. Il parsing di un attributo.
20130417-143954.jpg

Facciamo un veloce e semplice esempio di documento XML in modo da comprendere meglio il codice che andremo a scrivere.

[code lang=”xml”]
<pre>
<listaogg>
<ogg id="1">
<nome>casa</nome>
</ogg>
<ogg id="2">
<nome>cane</nome>
</ogg>
<ogg id="3">
<nome>Mac</nome>
</ogg>
</listaogg>
</pre>
[/code]
Bene, come possiamo vedere abbiamo tre piccoli “oggetti” nel nostro file XML. Per l’esempio di questa guida possiamo scriverlo in un comune file chiamato lista.xml, in questo modo sarà più semplice capire il codice che ci interessa. A seguire troverai il codice che esegue la magia di leggere l’attributo id di ogni elemento.
Se sei troppo pigro per guardarti l’inizializzazione del codice (io lo sarei), il punto chiave é il metodo attributeForName dell’oggetto CXMLElement usato in questo modo: [[node attributeForName:@”id”] stringValue]
[code lang=”obj-c”]
// metteremo i dati in un array
NSMutableArray *res = [[NSMutableArray alloc] init];

// usiamo un file locale per questo esempio
NSString *XMLPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@&amp;quot;lista.xml&amp;quot;];
NSData *XMLData = [NSData dataWithContentsOfFile:XMLPath];
CXMLDocument *doc = [[[CXMLDocument alloc] initWithData:XMLData options:0 error:nil] autorelease];

NSArray *nodes = NULL;
// cerchiamo il nodo ogg
nodes = [doc nodesForXPath:@&amp;quot;//ogg&amp;quot; error:nil];

for (CXMLElement *node in nodes) {
NSMutableDictionary *item = [[NSMutableDictionary alloc] init];
int counter;
for(counter = 0; counter &amp;lt; [node childCount]; counter++) {
// procediamo come: dizionario con chiavi prese dal documento XML
[item setObject:[[node childAtIndex:counter] stringValue] forKey:[[node childAtIndex:counter] name]];
}

// ed eccolo qui – attributeForName! Semplice!
[item setObject:[[node attributeForName:@&amp;quot;id&amp;quot;] stringValue] forKey:@&amp;quot;id&amp;quot;]; // &amp;lt;—— in questo caso id é l’attributo che ci interessa

[res addObject:item];
[item release];
}

// e stampiamo il risultato in console
NSLog(@&amp;quot;%@&amp;quot;, res);
[res release];
[/code]
Ed ecco il risultato:
[code lang=”obj-c”]
2013-04-17 13:54:01.078 demo[1901:207] (
{
id = 1;
name = casa;
},
{
id = 2;
name = cane;
},
{
id = 3;
name = Mac;
}
)
[/code]

Misterioso “text=\n”
Ripulire tutti gli spazi bianchi e i da capo dal file XML potrebbe non essere un opzione per tutte le applicazioni, quindi ecco l’unica soluzione che ci permetterà di capire se il valore per qualche chiave é vuoto.
Ovviamente, se il documento XML ha la chiave “text” e potrebbe essere vuota…dovresti controllare anche quello.

[code lang=”obj-c”]
NSString * value = [[[node childAtIndex:counter] stringValue] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
if ([value length] != 0){
[item setObject:[[node childAtIndex:counter] stringValue] forKey:[[node childAtIndex:counter] localName]];

}
[/code]