Una tarea simple que es la columna vertebral de muchas aplicaciones es la capacidad de analizar archivos XML. Y, afortunadamente, Xcode hace que sea relativamente fácil analizar un archivo XML en Objective-C.
Un archivo XML puede contener cualquier cosa, desde datos básicos sobre su aplicación hasta un feed RSS para un sitio web. También pueden ser una excelente forma de actualizar información dentro de tu aplicación de forma remota, evitando así la necesidad de enviar un nuevo binario a Apple simplemente para añadir un nuevo elemento a una lista.
Entonces, ¿cómo procesamos los archivos XML en Xcode? El proceso contiene pasos para inicializar las variables a utilizar, iniciar el proceso del analizador XML, alimentar ese proceso con un archivo, el inicio de un elemento individual, los caracteres (valor) dentro del elemento, el final de un elemento individual y el final del proceso de análisis.
En este ejemplo, analizaremos un archivo de Internet pasándole una dirección web (URL) determinada.
Comenzaremos con la construcción del archivo de cabecera. Este es un ejemplo de un archivo de cabecera muy básico para un controlador de vista detallada con los requisitos mínimos para analizar nuestro archivo:
@interface RootViewController : UITableViewController { DetailViewController *detailViewController; NSXMLParser *rssParser; NSMutableArray *s; NSMutableDiccionario *item; NSString *currentElement; NSMutableString *ElementValue; > Valor del elementoBOOL errorParsing; } @propiedad (no atómico, retener) IBOutlet DetailViewController *detailViewController; - (void)parseXMLFileAtURL:(NSString *)URL;
La función parseXMLFileAtURL iniciará el proceso por nosotros. Cuando termine, el NSMutableArray «s» retendrá nuestros datos. La matriz estará formada por diccionarios mutables con claves relacionadas con los nombres de campo en el archivo XML.
Ahora que hemos configurado las variables necesarias, pasaremos a la reunión del proceso en el archivo.m:Pre data-type=»code»>- (void)parserDidStartDocument:(NSXMLParser *)parser{
(NSXMLParser *)parser{
)NSLog(@»Archivo encontrado y análisis iniciado»);
}
>
Esta función se ejecuta al inicio del proceso. No hay necesidad de poner nada en esta función, pero si desea realizar una tarea cuando el archivo comienza a ser analizado, aquí es donde usted pondría su código.
- (void)parseXMLFileAtURL:(NSString *)URL (NSString *){ >NSString *agentString = @"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; es-us) AppleWebKit/525.27.1 (KHTML, como Gecko) Version/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 ]; s = [[NSMutableArray alloc] init]; errorParsing=NO; rssParser = [[NSXMLParser alloc] initWithData:xmlFile]; rssParser setDelegate:self]; // Puede que tenga que activar algunas de estas opciones dependiendo del tipo de archivo XML que esté analizando.rssParser setShouldProcessNamespaces:NO]; rssParser setShouldReportNamespacePrefixes:NO]; rssParser setShouldResolveExternalEntities:NO]; [rssParser parse]; }
>
Esta función le indica al motor que descargue un archivo en una dirección web (URL) en particular e inicie el proceso de análisis. Le decimos al servidor remoto que somos un Safari que se ejecuta en Mac en caso de que el servidor intente redirigir el iPhone/iPad a una versión móvil.
Las opciones al final son específicas para ciertos archivos XML. La mayoría de los archivos RSS y los archivos XML genéricos no necesitarán que estén activados.- (void)parser:(NSXMLParser *)parser parseErrorOcurred:(NSError *)parseError {
)NSString *errorString =[NSString stringWithFormat:@»Error code %i»,[parseError code]]];
NSLog(@»Error parsing XML: %@», errorString);
errorParsing=YES;
}
<
Se trata de un sencillo enrutamiento de comprobación de errores que establecerá un valor binario si encuentra un error. Es posible que necesite algo más específico aquí, dependiendo de lo que esté haciendo. Si simplemente necesita ejecutar algún código después del procesamiento en caso de error, la variable binaria errorParsing puede ser llamada en ese momento.- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)namespaceURI qualifiedName:(NSString *)qAtributos de nombre:(NSDictionary *)attributeDict{
>.currentElement =[elementName copy];
.ElementValue = [[NSMutableString alloc] init];
si ([elementName isEqualToString:@»item»]) {
item = [ [[NSMutableDictionary alloc] init];
}
La carne del analizador XML contiene tres funciones, una que se ejecuta al principio de un elemento individual, otra que se ejecuta en medio del análisis del elemento y otra que se ejecuta al final del elemento.
Para este ejemplo, analizaremos un archivo similar a los archivos RSS que descomponen los elementos en grupos bajo el encabezado «items» dentro del archivo XML. Al comienzo del proceso, estamos comprobando el nombre del elemento «item» y asignando nuestro diccionario de ítems cuando se detecta un nuevo grupo. De lo contrario, inicializamos nuestra variable para el valor.- (void)parser:(NSXMLParser *)parser foundCaracters:(NSString *)string{
ElementValue appendString:string];
}
>
Esta es la parte fácil. Cuando encontramos caracteres, simplemente los añadimos a nuestra variable «ElementValue».- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
)si ([elementName isEqualToString:@»item»]) {
s addObject:[item copy]];
} si no {
ítem setObject:ElementValue forKey:elementName];
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>»»»»»»»»»»»»-«»»-«»»- el elemento de la que se ejecutó el íb>.»»»»»>.}
}
>
Cuando terminamos de procesar un elemento, tenemos que hacer una de dos cosas: (1) Si el elemento final es «item», hemos terminado nuestro grupo, por lo que añadiremos nuestro diccionario a nuestra matriz de «s». O (2) si el elemento no es «item», fijaremos el valor en nuestro diccionario con una clave que coincida con el nombre del elemento. (Esto significa que no necesitamos una variable individual para cada campo dentro del archivo XML. Podemos procesarlos un poco más dinámicamente.)- (void)parserDidEndDocument:(NSXMLParser *) parser {
if (errorParsing == NO)
br>{
>NSLog(@»XML processing done!»);
} si no {
NSLog(@»Error occurred during XML processing»);
}
}
>
Esta es la última función necesaria para nuestra rutina de análisis. Simplemente termina el documento. Pondrás aquí cualquier código que quieras para terminar el proceso o cualquier cosa especial que quieras hacer en caso de error.
Una cosa que muchas aplicaciones pueden querer hacer aquí es guardar los datos y/o el archivo XML en un archivo del dispositivo. De esta manera, si el usuario no está conectado a Internet la próxima vez que cargue la aplicación, todavía puede obtener esta información.
Por supuesto, no podemos olvidar la parte más importante: decirle a su aplicación que analice el archivo (¡y darle una dirección web para encontrarlo!).
Para iniciar el proceso, sólo tiene que añadir esta línea de código al lugar apropiado donde desea realizar el procesamiento XML:
[self parseXMLFileAtURL:@"http://www.webaddress.com/file.xml"];