2009-07-06 23 views
18

Hoy estoy buscando cómo hacer un analizador XML simple en Cocoa (para el escritorio). Estoy pensando en utilizar NSXMLParser para analizar los datos, pero no estoy muy seguro de por dónde empezar. El archivo XML en la web no tiene mucha información, solo una lista simple con algunas cosas que necesito guardar en una variable. ¿Alguien tiene alguna sugerencia sobre cómo hacer esto, ya que la documentación en línea sobre esto no tiene demasiado sentido.XML de análisis en Cocoa

¡Gracias por cualquier ayuda!

EDITAR La razón por la que estoy queriendo crear un analizador XML es obtener información de una base de datos MySQL en el servidor de la aplicación cliente. Si hay alguna forma mejor de hacerlo además de un analizador XML, ¡por favor házmelo saber!

+0

¿qué no tiene sentido en la documentación en línea? – hhafez

+0

No estoy seguro de lo que debo anular para que funcione. – PF1

+0

No hay nada que anular. Usted hace un objeto separado y lo nombra delegado del analizador. En ese objeto, respondes a ciertos mensajes (algunos obligatorios, algunos opcionales) que te dicen qué ha encontrado el analizador. –

Respuesta

48

Así es como funciona:

Hay una clase llamada NSXMLParser. Se usa para analizar archivos XML. Sin embargo, NSXMLParser es estúpido. Todo lo que sabe hacer es analizar XML, pero no sabe lo que se supone que debe hacer con la información que encuentra.

Ingrese un delegado. Un delegado es como una niñera. Dado que XMLParser no tiene ni idea de qué hacer con la información que encuentra, va y le pregunta a su delegado sobre todas y cada una de las cosas: "¡Oye! ¡Empecé a analizar un documento! ¿Se supone que debo hacer algo?" "¡Oye! ¡Encontré algunos CDATA! ¡Qué se supone que debo hacer con eso!" "¡Oye, encontré otra etiqueta!" "¡Oye! ¡Encontré una etiqueta de cierre!", Y así sucesivamente. Todos estos "¡Oye!" las declaraciones son métodos delegados, o en otras palabras, son métodos opcionales que un objeto delegado puede elegir implementar. Por lo general (pero no siempre), el objeto que crea NSXMLParser también es el delegado, pero ese no tiene que ser el caso.

lo que podría tener algo como esto:

NSXMLParser * parser = [[NSXMLParser alloc] initWithContentsOfURL:someURLToAnXMLFile]; 
[parser setDelegate:self]; 
[parser parse]; 
[parser release]; 

Luego, en ese mismo objeto (auto), puede que tenga algunos de estos métodos:

- (void)parserDidStartDocument:(NSXMLParser *)parser { 
    //the parser started this document. what are you going to do? 
} 

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict { 
    //the parser found an XML tag and is giving you some information about it 
    //what are you going to do? 
} 

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 
    //the parser found some characters inbetween an opening and closing tag 
    //what are you going to do? 
} 

- (void)parserDidEndDocument:(NSXMLParser *)parser { 
    //the parser finished. what are you going to do? 
} 

Hay un montón de éstos métodos enumerados en la documentación. Simplemente diríjase a la referencia de la clase NSXMLParser, y todos figuran en la sección "Métodos delegados". Una vez que te acostumbras, NSXMLParser es bastante fácil de usar. Es un SAX Parser, lo que significa que es un analizador basado en eventos. Encuentra cosas, y te dice acerca de eso.

+0

Gracias Dave: ¡Realmente útil! Y, para el futuro, ¿recomendaría usar XML o MYSQL para las comunicaciones de bases de datos/clientes? – PF1

+3

Probablemente usaría ambos. Si necesitaba una conexión cliente-servidor, y controlaba ambos extremos, probablemente mantendría los datos en una base de datos MySQL, y luego accedería con algunos scripts PHP que escinden los datos apropiados formateados como XML (XML de Plist específicamente, por lo Podría hacer cosas como NSArray * myArray = [NSArray arrayWithContentsOfURL: urlToMyPHPScript];) –

+0

@Dave ¿Cómo formatearía XML como PLIST, y eso significaría que podría hacer un NSDictionary y ordenarlo así? También he estado probando algunas cosas con NSXMLParser, y me pregunto cómo sugeriría utilizar los comandos que publicó anteriormente para asociar el elemento y los caracteres encontrados. Por ejemplo, usted sabe que "Alguna descripción" está en el elemento "Descripción". Gracias por toda su ayuda. – PF1