Un'attività semplice che costituisce la spina dorsale di molte app è la capacità di analizzare i file XML. E, per fortuna, Xcode rende relativamente facile analizzare un file XML in Objective-C.
Un file XML può contenere qualsiasi cosa, dai dati di base della tua app a un feed RSS per un sito web. Possono anche essere un ottimo modo per aggiornare le informazioni all'interno della tua app da remoto, evitando così la necessità di inviare un nuovo binario ad Apple semplicemente per aggiungere un nuovo elemento a un elenco.
Quindi, come possiamo elaborare i file XML in Xcode? Il processo contiene passaggi per l'inizializzazione delle variabili da utilizzare, l'avvio del processo parser XML, l'alimentazione di quel processo un file, l'inizio di un singolo elemento, i caratteri (valore) all'interno dell'elemento, la fine di un singolo elemento e la fine del processo di analisi.
In questo esempio, analizzeremo un file da Internet trasmettendogli un particolare indirizzo Web (URL).
Inizieremo con la creazione del file di intestazione. Questo è un esempio di un file di intestazione di base per un controller di visualizzazione dei dettagli con i requisiti minimi per analizzare il nostro file:
@interface RootViewController: UITableViewController {DetailViewController * detailViewController;NSXMLParser * rssParser;NSMutableArray * articoli;NSMutableDictionary * elemento;NSString * currentElement;NSMutableString * ElementValue;BOOL errorParsing;}@property (nonatomic, retain) IBOutlet DetailViewController * detailViewController;- (void) parseXMLFileAtURL: (NSString *) URL;La funzione parseXMLFileAtURL avvierà il processo per noi. Al termine, gli "articoli" di NSMutableArray conserveranno i nostri dati. La matrice sarà composta da dizionari mutabili con le chiavi relative ai nomi dei campi nel file XML. Ora che abbiamo impostato le variabili necessarie, passeremo alla riunione del processo nel file .m:
- (void) parserDidStartDocument: (NSXMLParser *) parser {NSLog (@ "File trovato e analisi iniziata");} Questa funzione viene eseguita all'inizio del processo. Non è necessario inserire nulla in questa funzione, ma se si desidera eseguire un'operazione quando il file viene analizzato, è qui che si inserisce il codice.
- (void) parseXMLFileAtURL: (NSString *) URL{NSString * agentString = @ "Mozilla / 5.0 (Macintosh; U; Intel Mac OS X 10_5_6; it-it) AppleWebKit / 525.27.1 (KHTML, come Gecko) Versione / 3.2.1 Safari / 525.27.1";NSMutableURLRequest * request = NSMutableURLRequest requestWithURL:NSURL URLWithString: URL;request setValue: agentString forHTTPHeaderField: @ "User-Agent";xmlFile = NSURLConnection sendSynchronousRequest: request returningResponse: nil error: nil;articles = NSMutableArray alloc init;errorParsing = NO;rssParser = NSXMLParser alloc initWithData: xmlFile;rssParser setDelegate: self;// Potrebbe essere necessario attivare alcuni di questi in base al tipo di file XML che si sta analizzandorssParser setShouldProcessNamespaces: NO;rssParser setShouldReportNamespacePrefixes: NO;rssParser setShouldResolveExternalEntities: NO;rssParser parse;} Questa funzione indica al motore di scaricare un file su un particolare indirizzo Web (URL) e avviare il processo per analizzarlo. Stiamo dicendo al server remoto che siamo Safari in esecuzione su Mac nel caso in cui il server tenti di reindirizzare l'iPhone / iPad a una versione mobile.Le opzioni alla fine sono specifiche per determinati file XML. La maggior parte dei file RSS e file XML generici non ne avranno bisogno.
- (void) parser: (NSXMLParser *) parser parseErrorOccurred: (NSError *) parseError {NSString * errorString = NSString stringWithFormat: @ "Codice errore% i", parseError code;NSLog (@ "Errore nell'analisi XML:% @", errorString);errorParsing = SI;}Questo è un semplice routing di controllo degli errori che imposterà un valore binario se riscontra un errore. Potresti aver bisogno di qualcosa di più specifico qui, a seconda di cosa stai facendo. Se hai semplicemente bisogno di eseguire del codice dopo l'elaborazione in caso di errore, la variabile binaria errorParsing può essere chiamata in quel momento.
- (void) parser: (NSXMLParser *) parser didStartElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI qualifiedName: (NSString *) qName attributes: (NSDictionary *) attributeDict {currentElement = elementName copy;ElementValue = NSMutableString alloc init;if (elementName isEqualToString: @ "item") {item = NSMutableDictionary alloc init;}} La carne del parser XML contiene tre funzioni, una che viene eseguita all'inizio di un singolo elemento, una che viene eseguita durante l'analisi dell'elemento e una che viene eseguita alla fine dell'elemento. Per questo esempio, analizzeremo un file simile ai file RSS che scompongono gli elementi in gruppi sotto l'intestazione di "elementi" all'interno del file XML. All'inizio dell'elaborazione, stiamo controllando il nome dell'elemento "elemento" e assegnando il nostro dizionario degli articoli quando viene rilevato un nuovo gruppo. Altrimenti, inizializziamo la nostra variabile per il valore.
- (void) parser: (NSXMLParser *) parser foundCharacters: (NSString *) string {ElementValue appendString: string;} Questa è la parte facile. Quando troviamo i caratteri, li aggiungiamo semplicemente alla nostra variabile "ElementValue".
- (void) parser: (NSXMLParser *) parser didEndElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI qualifiedName: (NSString *) qName {if (elementName isEqualToString: @ "item") {articoli addObject: item copy;} altro {item setObject: ElementValue forKey: elementName;}} Quando abbiamo finito di elaborare un elemento, dobbiamo fare una delle due cose: (1) se l'elemento finale è "item", abbiamo finito il nostro gruppo, quindi aggiungeremo il nostro dizionario al nostro array di "articoli" ". Oppure (2) se l'elemento non è "elemento", imposteremo il valore nel nostro dizionario con una chiave che corrisponde al nome dell'elemento. (Questo significa che non abbiamo bisogno di una singola variabile per ogni campo all'interno del file XML. Possiamo elaborarli un po 'più dinamicamente.)
- (void) parserDidEndDocument: (NSXMLParser *) parser {if (errorParsing == NO){NSLog (@ "Elaborazione XML eseguita!");} altro {NSLog (@ "Errore durante l'elaborazione XML");}} Questa è l'ultima funzione necessaria per la nostra routine di analisi. Termina semplicemente il documento. In questo caso, inserirai qualsiasi codice in cui desideri completare la procedura o qualcosa di speciale che potresti voler fare in caso di errore. Una cosa che molte app potrebbero voler fare qui è quella di salvare i dati e / o il file XML in un file sul dispositivo. In questo modo, se l'utente non è connesso a Internet la prossima volta che caricano l'app, possono comunque ottenere queste informazioni. Certo, non possiamo dimenticare la parte più importante: dire alla tua applicazione di analizzare il file (e dargli un indirizzo web per trovarlo!). Per avviare il processo, è sufficiente aggiungere questa riga di codice nella posizione appropriata in cui si desidera eseguire l'elaborazione XML:
self parseXMLFileAtURL: @ "http://www.webaddress.com/file.xml";