Cómo analizar archivos XML en Xcode

Aunque un incorporado XML parser agrega valor real a una nueva aplicación de escritorio o móvil, codificar esa funcionalidad generalmente requiere mucho tiempo de desarrollo y pruebas beta. El programa Xcode de Apple incluye un analizador XML que pasa por alto la mayor parte de este trabajo manual.

Un XML El archivo puede contener cualquier cosa, desde datos básicos sobre su aplicación hasta un RSS Feed para un sitio web. También pueden ser una excelente manera de actualizar 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.

El proceso de Xcode

El proceso integrado de Xcode contiene pasos para inicializar las variables que se utilizarán, iniciar el proceso del analizador XML, alimentar ese proceso con un archivo, evaluar elementos individuales y los caracteres (valor) dentro de esos elementos, reconocer el final de un elemento individual y terminar el análisis proceso.

instagram viewer

Utilice el analizador XML

Para ilustrar los detalles, analizaremos un archivo de ejemplo de Internet pasándole una dirección web particular (URL).

Empiece por crear 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;
Artículos NSMutableArray *;
NSMutableDictionary * elemento;
NSString * currentElement;
NSMutableString * ElementValue;
BOOL errorParsing;
}
@property (no atómico, retener) IBOutlet DetailViewController * detailViewController;
- (void) parseXMLFileAtURL: (NSString *) URL;


La función parseXMLFileAtURL inicia el proceso. Cuando finaliza, los "artículos" de NSMutableArray contienen los datos. La matriz consta de diccionarios mutables con claves relacionadas con los nombres de campo en el archivo XML.

A continuación, inicialice el proceso:

- (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 debe colocar su código.

Indique al programa que descargue algo

A continuación, indique al programa que descargue algo:

- (void) parseXMLFileAtURL: (NSString *) URL
{
NSString * agentString = @ "Mozilla / 5.0 (Macintosh; U; Intel Mac OS X 10_5_6; es) 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: solicitud returnResponse: nil error: nil];
artículos = [[NSMutableArray alloc] init];
errorParsing = NO;
rssParser = [[NSXMLParser alloc] initWithData: xmlFile];
[rssParser setDelegate: self];
// Es posible que deba activar algunos de estos en función del tipo de archivo XML que esté analizando
[rssParser setShouldProcessNamespaces: NO];
[rssParser setShouldReportNamespacePrefixes: NO];
[rssParser setShouldResolveExternalEntities: NO];
[rssParser parse];
}


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

Error: compruebe el resultado

Realice una comprobación básica de errores en el resultado:

- (void) analizador: (NSXMLParser *) analizador parseErrorOccurred: (NSError *) parseError {
NSString * errorString = [NSString stringWithFormat: @ "Código de error% i", [código parseError]];
NSLog (@ "Error al analizar XML:% @", errorString);
errorParsing = YES;
} Este enrutamiento de verificación de errores establece 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, el


Esta rutina de verificación de errores establece 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, se puede llamar a la variable binaria de análisis de errores en ese momento.

Analizar el contenido recuperado

A continuación, el programa desglosa el contenido recuperado y lo analiza:

- (void) analizador: (NSXMLParser *) analizador didStartElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI qualifiedName: (NSString *) qName atributos: (NSDictionary *) attributeDict {
currentElement = [copia del nombre del elemento];
ElementValue = [[NSMutableString alloc] init];
if ([elementName isEqualToString: @ "elemento"]) {
item = [[NSMutableDictionary alloc] init];
}
}


La parte principal del analizador XML contiene tres funciones, una que se ejecuta al comienzo de un elemento, uno que se ejecuta durante el análisis del elemento, y uno 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 título de artículos dentro del archivo XML. Al comienzo del procesamiento, buscamos el nombre del elemento "elemento" y asignamos 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: string];
}


Cuando encontramos caracteres, simplemente los agregamos a nuestra variable ElementValue:

- (void) analizador: (NSXMLParser *) analizador didEndElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI calificadoName: (NSString *) qName {
if ([elementName isEqualToString: @ "elemento"]) {
[artículos addObject: [copia del artículo]];
} demás {
[elemento setObject: ElementValue forKey: elementName];
}
}

Qué sucede cuando se completa el análisis

Cuando el programa termina de procesar un elemento, debe hacer una de dos cosas:

  • Si el elemento final es Articulo, hemos terminado nuestro grupo, así que agregaremos nuestro diccionario a nuestra variedad de artículos.
  • Si el elemento no es Articulo, 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).

Esta es la última función necesaria para nuestra rutina de análisis; termina el documento. Coloque aquí cualquier código final o especifique una subrutina de corrección de errores:

- (void) parserDidEndDocument: (NSXMLParser *) parser {
si (errorParsing == NO)
{
NSLog (@ "¡Procesamiento XML terminado!");
} demás {
NSLog (@ "Se produjo un error durante el procesamiento de XML");
}
}

Guardar los datos

Una cosa que muchas aplicaciones pueden querer hacer aquí es guardar los datos o el archivo XML en un archivo en el dispositivo. De esa manera, si el dispositivo no está conectado a Internet la próxima vez que se 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 iniciar el proceso, agregue esta línea de código al lugar apropiado donde desea realizar el procesamiento XML:

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