Com analitzar fitxers XML en Xcode

Una tasca senzilla que és la columna vertebral de moltes aplicacions és la capacitat d'analitzar fitxers XML. I, afortunadament, Xcode fa relativament fàcil analitzar un fitxer XML en Objective-C.

Un fitxer XML pot contenir qualsevol cosa des de les dades bàsiques sobre l'aplicació a un canal RSS d'un lloc web. També poden ser una gran manera d'actualitzar la informació de la vostra aplicació de forma remota, evitant així la necessitat de presentar un nou binari a Apple simplement per afegir un element nou a una llista.

Llavors, com procesem els fitxers XML en Xcode? El procés conté passos per inicialitzar les variables que s'utilitzaran, iniciant el procés d'anàlisi XML, alimentació que processa un fitxer, l'inici d'un element individual, els caràcters (valor) dins de l'element, el final d'un element individual i el final del procés d'anàlisi.

En aquest exemple, anem a analitzar un fitxer des d'Internet passant-li una adreça web particular ( URL ).

Començarem a construir el fitxer de capçalera. Aquest és un exemple d'un fitxer de capçalera molt bàsic per a un controlador de Vista Detall amb els requisits mínims per analitzar el nostre fitxer:

@interface RootViewController: UITableViewController {
DetallViewController * detailViewController;

NSXMLParser * rssParser;
Articles NSMutableArray *;
Element NSMutableDictionary *;
NSString * currentElement;
NSMutableString * ElementValue;
BOOL errorParsing;
}

@property (no anatòmic, retenir) IBOutlet DetailViewController * detailViewController;

- (void) parseXMLFileAtURL: (NSString *) URL;

La funció parseXMLFileAtURL iniciarà el procés per a nosaltres. Quan finalitzi, els articles "NSMutableArray" conservaran les nostres dades. La matriu es compondrà de diccionaris mutables amb claus relacionades amb els noms de camp en el fitxer XML.

Ara que hem configurat les variables necessàries, passarem a la reunió del procés en el fitxer .m:

- (void) parserDidStartDocument: (NSXMLParser *) analitzador {
NSLog (@ "S'ha trobat el fitxer i l'anàlisi");

}

Aquesta funció s'executa al començament del procés. No hi ha necessitat de posar res en aquesta funció, però si voleu realitzar una tasca quan el fitxer comenci a analitzar-se, aquí és on voleu posar el vostre codi.

- (void) parseXMLFileAtURL: (NSString *) URL
{

NSString * agentString = @ "Mozilla / 5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en-us) AppleWebKit / 525.27.1 (KHTML, com Gecko) Version / 3.2.1 Safari / 525.27.1";
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:
[NSURL URLWithString: URL]];
[request setValue: agentString forHTTPHeaderField: @ "Agent d'usuari"];
xmlFile = [NSURLConnection sendSynchronousRequest: request returningResponse: error nil: nil];


articles = [[NSMutableArray assign] init];
errorParsing = NO;

rssParser = [[NSXMLParser alloc] initWithData: xmlFile];
[rssParser setDelegate: self];

// És possible que necessiteu activar alguns d'aquests en funció del tipus de fitxer XML que esteu analitzant
[rssParser setShouldProcessNamespaces: NO];
[rssParser setShouldReportNamespacePrefixes: NO];
[rssParser setShouldResolveExternalEntities: NO];

[rssParser parse];

}

Aquesta funció indica al motor que descarregui un fitxer en una adreça web (URL) i inicieu el procés per analitzar-lo.

Expliquem al servidor remot que som un Safari que s'executa a Mac en el cas que el servidor intenti redirigir l' iPhone / iPad a una versió per a mòbils.

Les opcions al final són específiques de certs fitxers XML. La majoria de fitxers RSS i fitxers XML genèrics no els necessitaran.

- (anul·lador): (NSXMLParser *) parser parseErrorOccurred: (NSError *) parseError {

NSString * errorString = [NSString stringWithFormat: @ "Codi d'error% i", [parseError code]];
NSLog (@ "Error en l'anàlisi XML:% @", errorString);


errorParsing = SÍ;
}

Es tracta d'un encaminament simple de comprovació d'errors que establirà un valor binari si troba un error. És possible que necessiteu alguna cosa més específic aquí depenent del que feu. Si simplement heu d'executar algun codi després del processament en cas d'error, es pot trucar a la variable binaria errorParsing en aquest moment.

- (void) parser: (NSXMLParser *) parser didStartElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI qualifiedName: (NSString *) qName attributes: (NSDictionary *) attributeDict {
currentElement = [element name copy];
ElementValue = [[NSMutableString alloc] init];
if ([elementName isEqualToString: @ "item"]) {
item = [[NSMutableDictionary alloc] init];

}

}

La carn de l'analitzador XML conté tres funcions, una que s'executa al començament d'un element individual, una que s'executa al centre de l'anàlisi de l'element i una que s'executa al final de l'element.

Per a aquest exemple, anirem analitzant un fitxer similar als fitxers RSS que descomponen els elements en grups sota l'encapçalament de "elements" dins del fitxer XML. A l'inici del processament, comprovem el nom de l'element "element" i assignem el diccionari de l'element quan es detecta un grup nou. En cas contrari, inicialitzem la nostra variable pel valor.

- Analitzador (void): (NSXMLParser *) analitzador foundCharacters: (NSString *) string {
[ElementValue appendString: cadena];
}

Aquesta és la part fàcil. Quan trobem caràcters, només hem d'afegir-los a la nostra variable "ElementValue".

- (void) parser: (NSXMLParser *) parser didEndElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI qualifiedName: (NSString *) qName {
if ([elementName isEqualToString: @ "item"]) {
[articles addObject: [còpia de l'element]];
} més {
[element setObject: ElementValue forKey: elementName];
}

}

Quan hàgim acabat de processar un element, hem de fer una de les dues coses: (1) si l'element final és "element", hem acabat el nostre grup, així que afegirem el nostre diccionari a la nostra sèrie d'articles " ".

O (2) si l'element no és "element", establirem el valor en el nostre diccionari amb una clau que coincideixi amb el nom de l'element. (Això significa que no necessitem una variable individual per a cada camp dins del fitxer XML. Podem processar-los una mica més de forma dinàmica).

- (void) parserDidEndDocument: (NSXMLParser *) analitzador {

if (errorParsing == NO)
{
NSLog (@ "Processament XML fet!");
} més {
NSLog (@ "S'ha produït un error durant el processament XML);
}

}

Aquesta és l'última funció necessària per a la nostra rutina d'anàlisi. Simplement finalitza el document. Es mostrarà qualsevol codi que vulgui finalitzar el procés aquí o qualsevol cosa que vulgueu fer en cas d'error.

Una cosa que moltes aplicacions poden voler fer aquí és guardar el fitxer de dades i / o XML en un fitxer del dispositiu. D'aquesta manera, si l'usuari no està connectat a Internet la propera vegada que carreguin l'aplicació, encara poden obtenir aquesta informació.

Per descomptat, no podem oblidar la part més important: dir-li a la vostra aplicació que analitzi el fitxer (i que li proporcioni una adreça web per trobar-lo!).

Per iniciar el procés, només heu d'afegir aquesta línia de codi al lloc adequat on vulgueu fer el processament XML:

[self parseXMLFileAtURL: @ "http://www.webaddress.com/file.xml"];