Cómo analizar archivos XML en Xcode

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.

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 manera de actualizar la información dentro de su aplicación de forma remota, 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, comenzar 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 al pasarle una dirección web (URL) en particular.

Comenzaremos construyendo el 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;
NSMutableArray * artículos;
NSMutableDictionary * item;
NSString * currentElement; < br /> NSMutableString * ElementValue;
BOOL errorParsing;
}
@property (nonatomic, reta) IBOutlet DetailViewController * detailViewController;
- (void) parseXMLFileAtURL: (NSString *) URL ;

La función parseXMLFileAtURL iniciará el proceso por nosotros. Cuando finalice, los «artículos» de NSMutableArray mantendrán nuestros datos. La matriz estará compuesta 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:

 - (void) parserDidStartDocument: (NSXMLParser *) parser {
NSLog (@ "Archivo encontrado y análisis iniciado");
}

Esta función se ejecuta al inicio del proceso. No es necesario 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-us ) 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 returnResponse: nil error: nil];
articles = [[NSMutableArray alloc] init];
errorParsing = NO;
rssParser = [[NSXMLParser alloc] initWithData: xmlFile];
[rssParser setDelegate: self];
// Es posible que deba activar algunos de estos en dependiendo del tipo de archivo XML que esté analizando
[rssParser setShouldProcessNamespaces: NO];
[rssParser setShouldReportNamespacePrefixes: NO];
[rssParser setShouldResolveExternalEntities: NO];
[rss ];
}

Esta función le indica al motor que descargue un archivo en una dirección web (URL) en particular y comience 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 los necesitarán encendidos.

 - (vacío) analizador: (NSXMLParser *) analizador parseErrorOccurred: (NSError *) parseError {
NSString * errorString = [NSString stringWithFormat: @ "Código de error% i", [código de parseError] ];
NSLog (@ "Error al analizar XML:% @", errorString);
errorParsing = YES;
}

Esta es una ruta de verificación de errores simple eso 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 se puede llamar en ese momento.

 - (void) parser: (NSXMLParser *) parser didStartElement: (NSString * ) elementName namespaceURI: (NSString *) namespaceURI qualifiedName: (NSString *) qName atributos: (NSDictionary *) attributeDict {
currentElement = [elementName copy];
ElementValue = [[NSMutableString alloc] init]; < br /> if ([elementName isEqualToString: @ "item"]) {
item = [[NSMutableDictionary alloc] init];
}
}

La carne del analizador XML contiene tres funciones, una que se ejecuta al comienzo 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 desglosan los elementos en grupos bajo el encabezado de «elementos» dentro del archivo XML. Al comienzo del procesamiento, estamos verificando 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.

 - (vacío) analizador: (NSXMLParser *) analizador encontrado Caracteres: (NSString *) cadena {
[ElementValue appendString: cadena];
}


Esta es la parte fácil. Cuando encontramos caracteres, simplemente los agregamos a nuestra variable «ElementValue».

 - (void) analizador: (NSXMLParser *) analizador didEndElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI calificadoNombre: (NSString *) qName {
if ([elementName isEqualToString: @ "item"]) {
[artículos addObject: [item copy]];
} 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, por lo 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 {
if (errorParsing == NO)
{
NSLog (@ "¡Procesamiento XML hecho!");
} else {
NSLog (@ "Se produjo un error durante el procesamiento XML");
}
}

Esta es la última función necesaria para nuestra rutina de análisis. Simplemente termina el documento. Pondrá cualquier 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 pueden 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 su aplicación que analice el archivo (¡y darle una dirección web para encontrarlo!).

Para comenzar 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"]; 

Rate article
labsfabs.com
Add a comment