Desarrollo iOS: Leer y parsear un fichero XML

En este ejemplo vamos a ver paso por paso como leer datos procedentes de un archivo de tipo XML.

En nuestro ejemplo utilizaremos un fichero que se encuentra en Internet, pero podría hacerse leyendo un fichero que se encontrara dentro de la carpeta Resources de nuestro proyecto Xcode.

Para empezar abriremos Xcode e iremos al menú “File/New Proyect”. Elegiremos la opción “View based application”.

A continuación crearemos dos clases dentro del apartado “Classes”:

  • Entidad: es la clase que representa el tipo de entidades que vamos a leer del fichero: noticias, usuarios, libros, etc.
  • XMLController: será la clase que utilizaremos para implementar la lectura del fichero y la identificación de cada uno de los elementos que leeremos.

Para ello accederemos al menu “File / New file” y seleccionaremos “Objective-C class”.

En primer lugar vamos a cumplimentar los ficheros “Entidad.h” y “Entidad.m” que acabamos de crear.

Entidad.h

#import <Foundation/Foundation.h>

@interface Entidad : NSObject {
	NSString *campo1;
	NSString *campo2;
	NSString *campo3;
}

@property (nonatomic, retain) NSString *campo1;
@property (nonatomic, retain) NSString *campo2;
@property (nonatomic, retain) NSString *campo3;

@end

Entidad.m

#import "Entidad.h"

@implementation Entidad
@synthesize campo1, campo2, campo3;

@end

A continuación añadiremos los métodos necesarios a nuestra clase “XMLController”.

XMLController.h

#import <Foundation/Foundation.h>
@class Entidad;

@interface XMLController : NSObject {
	NSMutableString *currentNodeContent;
	NSMutableArray *entidades;
	NSXMLParser *parser;
	Entidad *currentEntidad;
}
@property (nonatomic, retain) NSMutableArray *entidades;

-(id) loadXMLByURL:(NSString *)urlString;

@end

XMLController.m

#import "XMLController.h"
#import "Entidad.h"

@implementation XMLController
@synthesize entidades;

// Método que realiza el parseo del documento XML indicado mediante una URL
-(id) loadXMLByURL:(NSString *) urlString {
	socios = [[NSMutableArray alloc] init];
	NSURL *url = [NSURL URLWithString:urlString];
	parser = [[NSXMLParser alloc] initWithContentsOfURL:url];
	parser.delegate = self;
	[parser parse];
	return self;
}

// Método que verifica cuando comienza la etiqueta "entidad"
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName
 namespaceURI:(NSString *)namespaceURI
 qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
	if ([elementName isEqualToString:@"entidad"]) {
		currentEntidad = [Entidad alloc];
		currentNodeContent = [[NSMutableArray alloc] init];
	}
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName
  namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
	if ([elementName isEqualToString:@"campo1"]) {
		currentEntidad.campo1 = currentNodeContent;
	}
	if ([elementName isEqualToString:@"campo2"]) {
		currentEntidad.campo2 = currentNodeContent;
	}
	if ([elementName isEqualToString:@"campo3"]) {
		currentEntidad.campo3 = currentNodeContent;
	}
	if ([elementName isEqualToString:@"entidad"]) {
		[socios	addObject:currentEntidad];
		[currentEntidad release];
		currentEntidad = nil;
		[currentNodeContent release];
		currentNodeContent = nil;
	}
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
	currentNodeContent = [string stringByTrimmingCharactersInSet:[NSCharacterSet
whitespaceAndNewlineCharacterSet]];
}

@end

Por último, en el método viewDidLoad de nuestra clase principal añadiremos el siguiente código:

	xmlController = [[XMLController alloc]
        loadXMLByURL:@"http://www.dominio.com/fichero.xml"];


13 Comentarios

    • Hola, quiero hacer un parser de un XML pero con el ejemplo que teneis no me sirve.
      Necesito mas ayuda.
      Acabp de introducirme en el mundo de Xcode y con el story board la interfaz es mas fácil ya que es pinchar y arrastar, pero ahora quiero meter en un tableview el contenido que me descargo de un xml y no se como hacerlo. He buscado por toda la red y no hay nada (en español).

      Gracias y un saludo.

  1. Pues a mi me parece que el código está bastante bien, a mi me ha servido, es más simple que el que yo estaba usando hasta ahora.
    El problema que tengo son las tildes, con el método que yo usaba antes, si tenias por ejemplo la palabra “Leganés”, a mi me salía “Legan”, y con tu método me sale “és”, como podría hacer para que me salga “Leganés”?

    • al final lo he hecho cambiando lo que has puesto en el foundCharacters por esto:

      if(!currentNodeContent)
      currentNodeContent = [[NSMutableString alloc] initWithString:string];
      else
      [currentNodeContent appendString:string];

      y en el didEndElement he puesto que siempre haga

      [currentNodeContent release];
      currentNodeContent = nil;

      no solo cuando es una entidad

      • me refería a este código.

  2. hola jcesar.
    me ocurría lo mismo que a ti, pero si hago las sustituciones que dices, me da este error:

    -[__NSArrayM appendString:]: unrecognized selector sent to instance 0x4b6a260
    2012-04-16 12:46:19.083 proyecto[60132:b903] *** Terminating app due to uncaught exception ‘NSInvalidArgumentException’, reason: ‘-[__NSArrayM appendString:]: unrecognized selector sent to instance 0x4b6a260′

    al ejecutar esta línea:
    [currentNodeContent appendString:string];

    tienes idea de qué puede estar mal?

    muchas gracias.

    • El error te esta indicando que estas llamando a un método que no existe. Esto puede ser por dos motivos, porque el parámetro que estas pasando debiera ser de un tipo y no lo es, o bien que la clase a la que estas mandando el mensaje (instancia en la que estas llamando al método) no es correcta. Echa un vistazo a tu código porque el ejemplo publicado funciona correctamente.

      Un saludo.

      • Sí, el código funciona y me ha servido de ayuda.
        Sólo comentar que en lugar de “socios” es “entidades”, creo.

  3. Hola con esta linea ‘xmlController = [[XMLController alloc] loadXMLByURL:@”http://www.dominio.com/fichero.xml”];’ me da un error, a q se debe :/

    • Hola Mario, si has puesto la línea tal cual el error esta en que la URL que yo indico en el artículo es un mero ejemplo, y hay que sustituirla por la que corresponda en tu desarrollo.

      ¿Tenías esa URL puesta?

  4. Sigue sin funcionarme el parseo de las tíldes y no entiendo los ejemplos que hay en los comentarios para “solucionarlo”, gracias.

  5. Pues estudien ingles. La información mas actualizada sobre programación en xcode esta en inglés… Espero les sirva, saludos… Yo he encontrado buenisimos tutoriales en inglés y he salido de problemas… awesome.. ;)

Escribir un comentario

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>