Como analizar ficheiros XML en Xcode

Unha tarefa sinxela que é a espiña dorsal de moitas aplicacións é a capacidade de analizar os ficheiros XML. E, afortunadamente, Xcode fai relativamente fácil analizar un ficheiro XML en Objective-C.

Un ficheiro XML pode conter calquera cousa de datos básicos sobre a túa aplicación a un feed RSS dun sitio web. Tamén poden ser unha excelente forma de actualizar a información da súa aplicación de forma remota, evitando así a necesidade de enviar un novo binario a Apple simplemente para engadir un novo elemento a unha lista.

Entón, como procesamos ficheiros XML en Xcode? O proceso contén pasos para inicializar as variables a empregar, iniciar o proceso de analizador XML, alimentar ese proceso dun ficheiro, o inicio dun elemento individual, os caracteres (valor) dentro do elemento, o final dun elemento individual e o final do proceso de análise.

Neste exemplo, analizaremos un arquivo de Internet ao pasarlle un enderezo web específico ( URL ).

Comezaremos a construír o ficheiro de cabeceira. Este é un exemplo dun ficheiro de cabeceira moi básico para un controlador de visualización detallada cos requisitos mínimos para analizar o noso ficheiro:

@interface RootViewController: UITableViewController {
DetailViewController * detailViewController;

NSXMLParser * rssParser;
Artigos NSMutableArray *;
Elemento NSMutableDictionary *;
NSString * currentElement;
NSMutableString * ElementValue;
BOOL errorParsing;
}

@ property (nonatomic, retain) IBOutlet DetailViewController * detailViewController;

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

A función parseXMLFileAtURL iniciará o proceso para nós. Cando remate, os "artigos" de NSMutableArray manterán os nosos datos. A matriz estará composta por dicionarios mutables con chaves relacionadas cos nomes de campo no ficheiro XML.

Agora que configuremos as variables necesarias, pasaremos á reunión do proceso no ficheiro .m:

- (void) parserDidStartDocument: (NSXMLParser *) parser {
NSLog (@ "Arquivo atopado e parsing comezado");

}

Esta función é executada ao comezo do proceso. Non hai necesidade de poñer nada nesta función, pero se queres realizar unha tarefa cando o arquivo comeza a ser analizado, aquí é onde poñerías o teu código.

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

NSString * agentString = @ "Mozilla / 5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en nós) AppleWebKit / 525.27.1 (KHTML, como Gecko) Versión / 3.2.1 Safari / 525.27.1";
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:
[NSURL URLWithString: URL]];
[request setValue: agentString forHTTPHeaderField: @ "User-Agent"];
xmlFile = [NSURLConnection sendSynchronousRequest: request returningResponse: nil error: nil];


artigos = [[NSMutableArray alloc] init];
errorParsing = NO;

rssParser = [[NSXMLParser alloc] initWithData: xmlFile];
[rssParso setDelegar: auto];

// Pode que deba activar algunhas destas dependendo do tipo de ficheiro XML que está a analizar
[rssParser setShouldProcessNamespaces: NO];
[rssPreser setShouldReportNamespacePrefixes: NO];
[rssPreser setShouldResolveExternalEntities: NO];

[rssParser parse];

}

Esta función instrúe ao motor a descargar un arquivo nun enderezo web específico (URL) e iniciar o proceso para analizalo.

Dixemos ao servidor remoto que somos un Safari que se está executando en Mac no caso de que o servidor tente redireccionar o iPhone / iPad a unha versión móbil.

As opcións ao final son específicas de certos ficheiros XML. A maioría dos ficheiros RSS e os ficheiros xenéricos de XML non precisan que estean conectados.

- (anulado) analizador: (NSXMLParser *) parser parseErrorOccurred: (NSError *) parseError {

NSString * errorString = [NSString stringWithFormat: @ "Código de erro% i", [parseError code]];
NSLog (@ "Erro ao analizar XML:% @", errorString);


errorParsing = SÍ;
}

Este é un sinxelo enrutamento de comprobación de erro que establecerá un valor binario se atopa un erro. Pode necesitar algo máis específico aquí dependendo do que estea a facer. Se simplemente precisa executar algún código despois do procesamento no caso de erro, pódese chamar a variable binaria de erroParsing nese momento.

- (void) parser: (NSXMLParser *) parser didStartElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI qualifiedName: (NSString *) qName atributos: (NSDictionary *) attributeDict {
currentElement = [copia do elementoName];
ElementValue = [[NSMutableString alloc] init];
se ([elementName isEqualToString: @ "item"]) {
item = [[NSMutableDictionary alloc] init];

}

}

A carne do analizador XML contén tres funcións, unha que se executa ao comezo dun elemento individual, unha que se executa no medio da análise do elemento e unha que se executa ao final do elemento.

Para este exemplo, imos analizar un arquivo semellante aos ficheiros RSS que dividen os elementos en grupos baixo o título de "elementos" no ficheiro XML. No inicio do procesamento, estamos a buscar o nome do elemento "elemento" e asignar o dicionario do noso elemento cando se detecte un novo grupo. Se non, inicializamos a nosa variable para o valor.

- (anulado) analizador: (NSXMLParser *) analizador foundCharacters: (NSString *) string {
[ElementValue appendString: cadea];
}

Esta é a parte fácil. Cando atopamos personaxes, simplemente engadilas á nosa variable "ElementValue".

- (void) parser: (NSXMLParser *) parser didEndElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI cualificadoName: (NSString *) qName {
se ([elementName isEqualToString: @ "item"]) {
[artigos addObject: [copia do elemento]];
} máis {
[item setObject: ElementValue forKey: elementName];
}

}

Cando terminamos de procesar un elemento, necesitamos facer unha das dúas cousas: (1) se o elemento final é "elemento", rematamos o noso grupo, entón engadiremos o noso dicionario á nosa variedade de "artigos ".

Ou (2) se o elemento non é "elemento", estableceremos o valor no noso dicionario cunha chave que coincida co nome do elemento. (Isto significa que non necesitamos unha variable individual para cada campo dentro do ficheiro XML. Podemos procesalas un pouco máis de forma dinámica).

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

se (errorParsing == NO)
{
NSLog (@ "Proceso XML feito!");
} máis {
NSLog (@ "Ocorreu un erro durante o procesamento XML");
}

}

Esta é a última función necesaria para a nosa rutina de análise. Simplemente remata o documento. Pór calquera código que desexe rematar o proceso aquí ou calquera cousa especial que queira que queira facer en caso de erro.

Unha cousa que moitas aplicacións poden querer facer aquí é gardar o ficheiro de datos e / ou XML nun ficheiro no dispositivo. Deste xeito, se o usuario non está conectado a Internet a próxima vez que cargue a aplicación, aínda poden obter a esta información.

Por suposto, non podemos esquecernos da parte máis importante: dicirlle á súa aplicación que analice o ficheiro (e dándolle un enderezo web para atopalo en!).

Para iniciar o proceso, só precisa engadir esta liña de código ao lugar axeitado onde desexa facer o procesamento XML:

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