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 una fuente RSS para un sitio web. También pueden ser una excelente forma de actualizar la información de forma remota en su aplicación, evitando así la necesidad de enviar un nuevo binario a Apple simplemente para agregar un nuevo elemento a una lista.
Entonces, ¿cómo procesamos los archivos XML en Xcode? El proceso contiene pasos para inicializar las variables que se utilizarán, iniciar el proceso del analizador XML, alimentar ese proceso de 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 al pasarle una dirección web particular (URL).
Comenzaremos con la construcción del archivo de encabezado. Este es un ejemplo de un archivo de encabezado 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;Artículos de NSMutableArray *;Elemento NSMutableDictionary *;NSString * currentElement;NSMutableString * ElementValue;BOOL errorParsing;}@ propiedad (no atómica, retener) IBOutlet DetailViewController * detailViewController;- (void) parseXMLFileAtURL: (NSString *) URL;La función parseXMLFileAtURL iniciará el proceso por nosotros. Cuando termine, los "artículos" de NSMutableArray mantendrán 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 al encuentro del proceso en el archivo .m:
- (void) parserDidStartDocument: (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 analizarse, aquí es donde colocaría su código.
- (void) parseXMLFileAtURL: (NSString *) URL{NSString * agentString = @ "Mozilla / 5.0 (Macintosh; U; Intel Mac OS X 10_5_6; es-es) AppleWebKit / 525.27.1 (KHTML, como Gecko) Versión / 3.2.1 Safari / 525.27.1";NSMutableURLRequest * request = NSMutableURLRequest requestWithURL:NSURL URLWithString: URL;solicitar setValue: agentString forHTTPHeaderField: @ "User-Agent";xmlFile = NSURLConnection sendSynchronousRequest: solicitud returnResponse: nil error: nil;articles = NSMutableArray alloc init;errorParsing = NO;rssParser = NSXMLParser alloc initWithData: xmlFile;rssParser setDelegate: self;// Es posible que necesite activar algunos de estos dependiendo del tipo de archivo XML que esté analizandorssParser 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 particular (URL) e inicie el proceso para analizarlo. Le estamos diciendo 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 parseErrorOccurred: (NSError *) parseError {NSString * errorString = NSString stringWithFormat: @ "Error code% i", parseError code;NSLog (@ "Error al analizar XML:% @", errorString);errorParsing = YES;}Este es un enrutamiento de comprobación de errores simple 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 el caso de error, la variable binaria errorParsing puede llamarse en ese momento.
- (void) parser: (NSXMLParser *) parser didStartElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI qualifiedName: (NSString *) qName atributos: (NSDictionary *) attributeDict {currentElement = copia de elementName;ElementValue = NSMutableString alloc init;if (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, una que se ejecuta durante la mitad 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 dividen los elementos en grupos bajo el encabezado de "elementos" dentro del archivo XML. Al comienzo del procesamiento, estamos comprobando el nombre del elemento "elemento" y asignando nuestro diccionario de elementos cuando se detecta un nuevo grupo. De lo contrario, inicializamos nuestra variable para el valor.
- Analizador (vacío): (NSXMLParser *) Analizador encontradoCaracteres: (NSString *) cadena {ElementValue appendString: string;} Esta es la parte facil. Cuando encontramos caracteres, simplemente los agregamos a nuestra variable "ElementValue".
- (void) parser: (NSXMLParser *) parser didEndElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI qualifiedName: (NSString *) qName {if (elementName isEqualToString: @ "item") {addObject de artículos: copia del artículo;} else {item setObject: ElementValue forKey: elementName;}} Cuando hayamos terminado de procesar un elemento, debemos hacer una de dos cosas: (1) si el elemento final es "elemento", hemos terminado nuestro grupo, así que agregaremos nuestro diccionario a nuestra variedad de "artículos ". O (2) si el elemento no es "elemento", estableceremos 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 {si (errorParsing == NO){NSLog (@ "¡Procesamiento de XML hecho!");} else {NSLog (@ "Error ocurrido durante el procesamiento de XML");}} Esta es la última función necesaria para nuestra rutina de análisis. Simplemente termina el documento. Pondrá el código que desee para finalizar el proceso aquí o cualquier cosa especial que desee hacer en caso de error. Una cosa que muchas aplicaciones podrían querer hacer aquí es guardar los datos y / o el archivo XML en un archivo en el dispositivo. De esa manera, si el usuario no está conectado a Internet la próxima vez que cargue la aplicación, aún puede obtener esta información. Por supuesto, no podemos olvidar la parte más importante: decirle a tu aplicación que analice el archivo (¡y dale una dirección web para encontrarlo en!). Para iniciar el proceso, simplemente necesita agregar esta línea de código en el lugar apropiado donde desea realizar el procesamiento XML:
self parseXMLFileAtURL: @ "http://www.webaddress.com/file.xml";