2009-07-06 11 views
18

Oggi sto cercando come creare un semplice parser XML in Cocoa (per il desktop). Sto pensando di usare NSXMLParser per analizzare i dati, ma non sono abbastanza sicuro da dove cominciare. Il file XML sul web non ha molti dati al suo interno, solo una semplice lista con alcune cose che ho bisogno di salvare in una variabile. Qualcuno ha qualche suggerimento su come fare questo, come la documentazione online su questo non ha troppo senso.Parsing XML in Cocoa

Grazie per qualsiasi aiuto!

EDIT Il motivo per cui sto cercando di creare un parser XML è quello di ottenere informazioni da un database MySQL su un server all'applicazione client. Se c'è un modo migliore per farlo oltre a un parser XML, per favore fatemelo sapere!

+0

cosa non ha senso nella documentazione online? – hhafez

+0

Non sono sicuro di cosa dovrei ignorare per farlo funzionare. – PF1

+0

Non c'è niente da escludere. Si crea un oggetto separato e lo si nomina delegato del parser. In quell'oggetto, rispondi a determinati messaggi (alcuni richiesti, alcuni facoltativi) che ti dicono cosa ha trovato il parser. –

risposta

48

Ecco come funziona:

C'è una classe chiamata NSXMLParser. È usato per analizzare i file XML. Tuttavia, NSXMLParser è stupido. Tutto quello che sa fare è analizzare XML, ma non sa cosa dovrebbe fare con le informazioni che trova.

Inserire un delegato. Un delegato è come una bambinaia. Dato che XMLParser non ha idea di cosa fare con le informazioni che trova, va e chiede al suo delegato su ogni cosa: "Ehi, ho iniziato a analizzare un documento! Devo fare qualcosa?" "Ehi, ho trovato un CDATA! Che cosa dovrei fare con questo!" "Ehi, ho trovato un altro tag!" "Ehi, ho trovato un tag di chiusura!", E così via. Tutti questi "Hey!" le istruzioni sono metodi delegati o, in altre parole, sono metodi facoltativi che un oggetto delegato può scegliere di implementare. Di solito (ma non sempre), l'oggetto che crea NSXMLParser è anche il delegato, ma non deve essere il caso.

così si potrebbe avere qualcosa di simile:

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

Poi in quello stesso oggetto (auto), si potrebbe avere alcuni di questi metodi:

- (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? 
} 

ci sono un sacco di questi metodi elencati nella documentazione. Basta andare al riferimento alla classe NSXMLParser e sono tutti elencati nella sezione "Metodi delegati". Una volta capito, NSXMLParser è abbastanza facile da usare. È un SAX Parser, il che significa che è un parser basato sugli eventi. Trova cose e te ne parla.

+0

Grazie Dave: Davvero utile! E, per il futuro, consiglieresti di utilizzare XML o MYSQL per le comunicazioni database/client? – PF1

+3

Probabilmente li userò entrambi. Se avessi bisogno di una connessione client-server, e avrei controllato entrambe le estremità, probabilmente avrei tenuto i dati in un database MySQL, quindi l'accesso con alcuni script PHP che sputano i dati appropriati che sono formattati come XML (in particolare XML Plist, quindi Potrei fare cose come NSArray * myArray = [NSArray arrayWithContentsOfURL: urlToMyPHPScript];) –

+0

@Dave Come potrei formattare XML come PLIST, e ciò significherebbe che potrei semplicemente fare un NSDictionary e ordinare in questo modo? Ho anche provato alcune cose con NSXMLParser e mi sto chiedendo come suggeriresti di usare i comandi che hai postato sopra per associare l'elemento ei caratteri trovati. Ad esempio, sai che "Alcune descrizioni" si trova nell'elemento "Descrizione". Grazie per tutto il vostro aiuto. – PF1