Come analizzare i file XML in Xcode

click fraud protection

Sebbene un built-in XML parser aggiunge valore reale a una nuova applicazione desktop o mobile, codificare tale funzionalità richiede in genere molto tempo di sviluppo e beta test. Il programma Xcode di Apple include un parser XML che aggira la maggior parte di questo lavoro manuale.

Un XML file può contenere qualsiasi cosa, dai dati di base sulla tua app a un RSS Feed 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.

Il processo Xcode

Il processo Xcode integrato contiene i passaggi per l'inizializzazione delle variabili da utilizzare, l'avvio del processo parser XML, l'alimentazione di un file a tale processo, valutare i singoli elementi e i caratteri (valore) all'interno di tali elementi, riconoscere la fine di un singolo elemento e terminare l'analisi processi.

Usa il parser XML

Per illustrare i dettagli, analizzeremo un file di esempio da Internet passandogli un particolare indirizzo web (

instagram viewer
URL).

Inizia con la creazione del file di intestazione. Questo è un esempio di un file di intestazione molto semplice per un controller di visualizzazione dei dettagli con i requisiti minimi per l'analisi del nostro file:

@interfaccia RootViewController: UITableViewController {
DetailViewController *detailViewController;
NSXMLParser *rssParser;
NSMutableArray *articoli;
NSMutableDictionary *item;
NSString *currentElement;
NSMutableString *ElementValue;
BOOL errorParsing;
}
@property (nonatomic, keep) IBOutlet DetailViewController *detailViewController;
- (void) parseXMLFileAtURL:(NSString *)URL;


La funzione parseXMLFileAtURL avvia il processo. Al termine, gli "articoli" di NSMutableArray contengono i dati. L'array è costituito da dizionari modificabili con chiavi relative ai nomi dei campi nel file XML.

Successivamente, inizializza il processo:

- (void) parserDidStartDocument:(NSXMLParser *)parser{
NSLog(@"File trovato e analisi avviata");
}

Questa funzione viene eseguita all'inizio del processo. Non è necessario inserire nulla in questa funzione, ma se si desidera eseguire un'attività quando il file inizia ad essere analizzato, è qui che si inserisce il codice.

Indica al programma di scaricare qualcosa

Quindi, istruisci il programma a scaricare qualcosa:

- (void) parseXMLFileAtURL:(NSString *)URL
{
NSString *agentString = @"Mozilla/5.0 (Macintosh; tu; 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]];
[richiesta setValue: agentString forHTTPHeaderField:@"User-Agent"];
xmlFile = [ NSURLConnection sendSynchronousRequest: request returnResponse: nil error: nil ];
articoli = [[NSMutableArray alloc] init];
errorParsing=NO;
rssParser = [[NSXMLParser alloc] initWithData: xmlFile];
[rssParser setDelegate: self];
// Potrebbe essere necessario attivare alcuni di questi a seconda del tipo di file XML che si sta analizzando
[rssParser setShouldProcessNamespaces: NO];
[rssParser setShouldReportNamespacePrefixes: NO];
[rssParser setShouldResolveExternalEntities: NO];
[rssParser analizza];
}


Questa funzione indica al motore di scaricare un file a un particolare indirizzo web (URL) e di avviare il processo per analizzarlo. Stiamo dicendo al server remoto che siamo un 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 alcuni file XML. La maggior parte dei file RSS e dei file XML generici non richiede l'attivazione.

Error-Controllare il risultato

Eseguire alcuni controlli di base degli errori sul risultato:

- (void) parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError {
NSString *errorString = [NSString stringWithFormat:@"Codice errore %i", [parseError code]];
NSLog(@"Errore durante l'analisi di XML: %@", errorString);
errorParsing=SI;
}Questo routing di controllo degli errori imposta un valore binario se incontra 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, il


Questa routine di controllo degli errori imposta un valore binario se rileva 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 di analisi degli errori può essere chiamata in quel momento.

Analizza il contenuto recuperato

Successivamente, il programma scompone il contenuto recuperato e lo analizza:

- parser (void):(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualificatoName:(NSString *)qName attributi:(NSDictionary *)attributeDict{
currentElement = [Copia NomeElemento];
ElementValue = [[NSMutableString alloc] init];
if ([nomeelemento isEqualToString:@"elemento"]) {
item = [[NSMutableDictionary alloc] init];
}
}


La carne del parser XML contiene tre funzioni, una che viene eseguita all'inizio di un individuo elemento, uno che viene eseguito durante l'analisi dell'elemento e uno che viene eseguito alla fine del elemento.

Per questo esempio, analizzeremo un file simile ai file RSS che suddividono gli elementi in gruppi sotto l'intestazione di elementi all'interno del file XML. All'inizio dell'elaborazione, stiamo controllando il nome dell'elemento "item" e assegnando il nostro dizionario degli elementi quando viene rilevato un nuovo gruppo. Altrimenti, inizializziamo la nostra variabile per il valore:

- (void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
[ElementValue appendString: stringa];
}


Quando troviamo i caratteri, li aggiungiamo semplicemente alla nostra variabile ValoreElemento:

- (void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualificatoName:(NSString *)qName{
if ([nomeelemento isEqualToString:@"elemento"]) {
[articoli addObject:[oggetto copia]];
} altro {
[item setObject: ElementValue forKey: elementName];
}
}

Cosa succede quando l'analisi è completa

Quando il programma finisce di elaborare un elemento, deve fare una delle due cose:

  • Se l'elemento finale è articolo, abbiamo terminato il nostro gruppo, quindi aggiungeremo il nostro dizionario alla nostra serie di articoli.
  • Se l'elemento non lo è articolo, imposteremo il valore nel nostro dizionario con una chiave che corrisponde al nome dell'elemento. (Ciò significa che non abbiamo bisogno di una variabile individuale per ogni campo all'interno del file XML. Possiamo elaborarli un po' più dinamicamente.)

Questa è l'ultima funzione necessaria per la nostra routine di analisi; finisce il documento. Inserisci qui un codice finale o specifica una subroutine di correzione degli errori:

- (void) parserDidEndDocument:(NSXMLParser *)parser {
if (errorParsing == NO)
{
NSLog(@"Elaborazione XML completata!");
} altro {
NSLog(@"Si è verificato un errore durante l'elaborazione XML");
}
}

Salva i dati

Una cosa che molte app potrebbero voler fare qui è salvare i dati o il file XML in un file sul dispositivo. In questo modo, se il dispositivo non è connesso a Internet la prossima volta che l'app viene caricata, può comunque ottenere queste informazioni.

Ovviamente, non possiamo dimenticare la parte più importante: dire alla tua applicazione di analizzare il file (e dargli un indirizzo web dove trovarlo!). Per avviare il processo, aggiungi questa riga di codice nel punto appropriato in cui desideri eseguire l'elaborazione XML:

 [self parseXMLFileAtURL:@" http://www.webaddress.com/file.xml"]; 
instagram story viewer