[Objective-c] XML parser per iPhone

Bene, semplifichiamoci la vita.
Ecco come fare un parser di un xml in modo facile e veloce in pochi passi!

ReverseGeo.h

[code lang=”java” autolinks=”false” collapse=”false” firstline=”1″ gutter=”true” htmlscript=”false” light=”false” padlinenumbers=”false” smarttabs=”true” tabsize=”4″ toolbar=”false”]
#import <foundation /Foundation.h>

@interface ReverseGeo : NSObject {
    /* dichiarazioni */
    NSXMLParser   *revParser; 
    NSMutableDictionary *item;
    NSString      *currentElement;
  
    /* Array contenenti i valori trovati nell’xml */
    NSMutableArray    *elements;
    NSMutableString   *citta, 
                      *via, 
                      *dug; 
}
– (void) parseXMLFileAtURL: (NSString *) URL;
@end
[/code]

ReverseGeo.m

[code lang=”java” autolinks=”false” collapse=”false” firstline=”1″ gutter=”true” htmlscript=”false” light=”false” padlinenumbers=”false” smarttabs=”true” tabsize=”4″ toolbar=”false”]
#import "ReverseGeo.h"

@implementation ReverseGeo
– (void) parseXMLFileAtURL: (NSString *) URL {

    @try {
        elements = [[NSMutableArray alloc] init];
        NSURL *xmlURL = [[NSURL alloc] initWithString:URL];

        revParser = [[NSXMLParser alloc] initWithContentsOfURL:xmlURL];

        [revParser setDelegate:self];
        [revParser setShouldProcessNamespaces:NO];
        [revParser setShouldReportNamespacePrefixes:NO];
        [revParser setShouldResolveExternalEntities:NO];
        [revParser parse];

    }@catch (NSException * e) { }
}

– (void) parserDidStartDocument: (NSXMLParser *) parser { }

– (void) parser: (NSXMLParser *) parser parseErrorOccurred: (NSError *) parseError {
    NSLog(@"Errore nel parser!");
}

– (void) parser: (NSXMLParser *) parser didStartElement: (NSString *) elementName
        namespaceURI: (NSString *) namespaceURI
        qualifiedName: (NSString *) qName
        attributes: (NSDictionary *) attributeDict {

    currentElement = [elementName copy];
    /* tag xml di partenza */
    if ([elementName isEqualToString:@"RevGeo_Out"])
    {
        item    = [[NSMutableDictionary alloc] init];
        citta   = [[NSMutableString alloc] init];
        via   = [[NSMutableString alloc] init];
        dug   = [[NSMutableString alloc] init];
    }
}

– (void) parser: (NSXMLParser *) parser didEndElement: (NSString *) elementName
    namespaceURI: (NSString *) namespaceURI
    qualifiedName: (NSString *) qName{

    if ([elementName isEqualToString:@"RevGeo_Out"])
    {
        /* riempio gli array con le chiavi */
        [item setObject:citta forKey:@"citta"];
        [item setObject:via forKey:@"via"];
        [item setObject:via forKey:@"dug"];

        [elements addObject:[item copy]];
    }
}

– (void) parser: (NSXMLParser *) parser foundCharacters: (NSString *) string {
    @try {
        /* prendo i tag xml seguenti */
        if ([currentElement isEqualToString:@"com"]) {
            [citta appendString:string];
        } else if ([currentElement isEqualToString:@"topo"]) {
            [via appendString:string];
        } else if ([currentElement isEqualToString:@"dug"]) {
            [dug appendString:string];
        }
    }@catch (NSException *e) { }
}

– (void) parserDidEndDocument: (NSXMLParser *)parser { }

– (void) dealloc {  [super dealloc]; }
@end[/code]

i due file sopra sono le definizioni per un corretto parser xml.

Ma… come si usa?
Beh, è più facile di quanto sembra!

[code lang=”java” autolinks=”false” collapse=”false” firstline=”1″ gutter=”true” htmlscript=”false” light=”false” padlinenumbers=”false” smarttabs=”true” tabsize=”4″ toolbar=”false”]/* dichiarazione e allocazione */
ReverseGeo reverse = [ReverseGeo new];

NSString *reverseUrl =
[[NSString alloc] initWithString:@"http://sito.xml"];
[reverse parseXMLFileAtURL:reverseUrl];

/* accesso ai campi */
NSLog(@"VIA: %@ – CITTA: %@", reverse-&gt;via, reverse-&gt;citta);[/code]

EOF!

[ref -> albertopasca.it]

 

Alberto Pasca

Software engineer @ Pirelli & C. S.p.A. with a strong passion for mobile  development, security, and connected things.