:::: MENU ::::

Leer un XML en una aplicación iPhone

4.33 avg. rating (81% score) - 3 votes

Tutorial para leer un fichero XML desde una aplicación iPhone/iPad. El fichero XML leido puede estar tanto en local (compilado con el proyecto) o en un servidor Web remoto.

El parseo de ficheros XML puede realizarse con la clase NSXMLParser y es una lectura guiada por eventos (event-driven, si alguien quiere buscar algo de teoría en Google).

Para realizar la lectura, he optado por crear una clase derivada de NSXMLParser e implementar los métodos de recepción de eventos y manejo de datos en esa clase. Otro método posible sería crear una instancia y definir un delegado para los eventos.

Además de derivar la clase NSXMLParser deberemos indicar que nuestra clase implementa el protocolo correspondiente, de forma que pueda recibir los eventos durante el parseo del XML. En nuestro fichero de cabecera, tendremos que escribir:

// La clase Parser deriva de NSXMLParser e implementa el protocolo NSXMLParserDelegate
@interface Parser : NSXMLParser  {

}

Seguramente tendremos que definir alguna variable o propiedad para almacenar los datos durante la lectura, pero dejaremos esto a gusto de cada uno.

Pasando a la implementación de la clase, únicamente deberemos preocuparnos de implementar los métodos del protocolo NSXMLParserDelegate. Aunque no todos son de obligada implementación, comentaresmos 4 métodos interesantes del protocolo.

// Evento cuando comienza el parseo del documento XML
-(void)parserDidStartDocument:(NSXMLParser *)parser;

// Evento cuando finaliza el parseo del documento XML
-(void)parserDidEndDocument:(NSXMLParser *)parser;

// Evento cada vez que comienza un nodo
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict;

// Evento cada vez que se lee el contenido de un nodo del XML
-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string;

Cuando comienza el parseo del documento, podemos aprovechar para crear las estructuras de datos necesarios para ir almacenando lo que nos interese del documento. De forma similar, aprovecharemos el evento de fin del documento para liberar la memoria correspondiente.

Los dos eventos más interesantes son el inicio de elemento y el contenido de elemento. Si por ejemplo tenemos un fichero sencillo como el siguiente:

<amigos>
  <persona genero="hombre" edad="30">Daniel</persona>
  <persona genero="mujer" edad="30">Ana</persona>
</amigos>

Recibiremos eventos en el siguiente order:

  1. Evento de inicio de fichero
  2. Evento de inicio de elemento (elemento <amigos>)
  3. Evento de inicio de elemento (elemento <persona>)
  4. Evento de retorno de caracteres (cadena ‘Daniel’)
  5. Evento de inicio de elemento (elemento <persona>)
  6. Evento de retorno de caracteres (cadena ‘Ana’)
  7. Evento de fin de fichero

Los parámetros más básicos del evento de inicio de elemento son los siguientes:

// Nombre del elemento. En nuestro caso: amigos, persona
(NSString *)elementName

// Atributos del elemento. En nuestro caso: genero, edad…
(NSDictionary *)attributeDict

En el caso de la lista de atributos, es un diccionario de datos (NSDictionary) en el que la clave de cada elemento es el nombre del atributo y el contenido, el valor del atributo.

// Ejemplo de lectura de un atributo
[attributeDict objectForKey:@"edad"]];

Para finalizar, y ya fuera de nuestra clase, tendremos que crear la instancia correspondiente e iniciar el proceso de lectura del XML.

Hay dos opciones, que el fichero esté en nuestro dispositivo (un fichero de la carpeta de recursos de la aplicación), o que esté alojado en un servidor Web y debamos acceder a través de una URL en Internet.

En el caso de XML en local, podemos crearlo de la siguiente forma:

NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle]pathForResource:@"mi_fichero" ofType:@"xml"]];
Parser *parser = [[Parser alloc] initWithContentsOfURL:url];

Y en caso del XML en un servidor remoto:

url = [[NSURL alloc] initWithString:add];
Parser *parser = [[Parser alloc] initWithContentsOfURL:url];

En ambos casos, al iniciar el Parser con la URL, se inicia el proceso de lectura del fichero.




3 Comments

Hey! Qué opinas sobre el artículo?