Cum se parsează fișierele XML în Xcode

O sarcină simplă, care este coloana vertebrală a mai multor aplicații, este abilitatea de a analiza fișierele XML. Și, din fericire, Xcode face relativ ușor să analizăm un fișier XML în Obiectiv-C.

Un fișier XML poate conține orice informație de bază despre aplicația dvs. într-un feed RSS pentru un site Web. Ele pot fi, de asemenea, o modalitate excelentă de actualizare a informațiilor din aplicația dvs. de la distanță, depășind astfel necesitatea de a trimite un nou binar către Apple pur și simplu pentru a adăuga un nou element la o listă.

Deci cum procesăm fișierele XML în Xcode? Procesul conține pași pentru inițializarea variabilelor care urmează să fie folosite, pornirea procesului de parser XML, hrănirea acelui proces cu un fișier, începerea unui element individual, caracterele (valoarea) în element, sfârșitul unui element individual și sfârșitul procesului de analiză.

În acest exemplu, vom analiza un fișier de pe Internet prin transmiterea unei anumite adrese web ( URL ).

Vom începe cu construirea fișierului antet. Acesta este un exemplu de fișier antet foarte simplu pentru un controler de vizualizare detaliat cu cerințele minime pentru parsarea fișierului nostru:

@interface RootViewController: UITableViewController {
DetailViewController * detailViewController;

NSXMLParser * rssParser;
NSMutableArray * articole;
Elementul NSMutableDictionary *;
NSString * currentElement;
NSMutableString * ElementValue;
BOOL errorParsing;
}

@property (nonatomic, reține) IBOutlet DetailViewController * detailViewController;

- (void) parseXMLFileAtURL: (NSString *) URL;

Funcția parseXMLFileAtURL va începe procesul pentru noi. Când se termină, articolele NSMutableArray "vor păstra datele noastre. Matricea va fi alcătuită din dicționarele care pot fi mutate cu chei legate de numele câmpurilor din fișierul XML.

Acum, când am creat variabilele necesare, vom trece la întâlnirea procesului din fișierul .m:

- (void) parserDidStartDocument: (NSXMLParser *) parser {
NSLog (@ "Fișierul a fost găsit și parsingul a început");

}

Această funcție rulează la începutul procesului. Nu este nevoie să puneți nimic în această funcție, dar dacă doriți să efectuați o sarcină atunci când fișierul începe să fie analizat, acesta este locul unde ați pune codul.

- (void) parseXMLFileAtURL: (NSString *) URL
{

NSString * agentString = @ "Mozilla / 5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en-us) AppleWebKit / 525.27.1 (KHTML, ca Gecko) versiunea / 3.2.1 Safari / 525.27.1";
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:
[NSURL URLWithString: URL]];
[request setValue: agentString pentruHTTPHeaderField: @ "User-Agent"];
xmlFile = [NSURLConnection sendSynchronousRequest: request returningResponse: eroare zero: zero];


articole = [[NSMutableArray alinia] init];
errorParsing = NO;

rssParser = [[NSXMLParser alocare] initWithData: xmlFile];
[rssParser setDelegare: auto];

// Poate fi necesar să transformați unele dintre acestea în funcție de tipul de fișier XML pe care îl parcurgeți
[rssParser setShouldProcessNamespaces: NU];
[rssParser setShouldReportNamespacePrefixes: NU];
[rssParser setShouldResolveExternalEntities: NO];

[rssParser parse];

}

Această funcție instruiește motorul să descarce un fișier la o anumită adresă web (URL) și să pornească procesul de analiză a acestuia.

Spunem serverului de la distanță că suntem un Safari care rulează pe Mac doar în cazul în care serverul încearcă să redirecționeze iPhone / iPad la o versiune mobilă.

Opțiunile de la sfârșit sunt specifice anumitor fișiere XML. Majoritatea fișierelor RSS și fișierelor XML generice nu vor avea nevoie de ele.

- (void) parser: (NSXMLParser *) analizor parseErrorOccurred: (NSError *) parseError {

NSString * errorString = [NSString stringWithFormat: @ "Cod de eroare% i", [parseError code]];
NSLog (@ "Eroare parsarea XML:% @", errorString);


errorParsing = YES;
}

Aceasta este o rutare simplu de verificare a erorilor care va stabili o valoare binară dacă întâmpină o eroare. Este posibil să aveți nevoie de ceva mai specific aici, în funcție de ceea ce faceți. Dacă pur și simplu trebuie să executați un cod după procesare în caz de eroare, variabila binară errorParsing poate fi apelată la acel moment.

- (void) parser: (NSXMLParser *) parser didStartElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI qualifiedName: (NSString *) qName atribute:
curentElement = [copie elementName];
ElementValue = [[NSMutableString alocare] init];
dacă ([elementName esteEqualToString: @ "element"]) {
element = [[NSMutableDictionary alloc] init];

}

}

Carnea parserului XML conține trei funcții, una care rulează la începutul unui element individual, una care rulează în timpul parsării elementului și una care rulează la sfârșitul elementului.

Pentru acest exemplu, vom analiza un fișier similar fișierelor RSS care defalc elemente în grupuri sub titlul "elemente" din fișierul XML. La începutul procesării, verificăm numele elementului "element" și alocarea dicționarului elementului nostru atunci când este detectat un nou grup. În caz contrar, inițializăm variabila noastră pentru valoare.

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

Aceasta este partea ușoară. Când găsim caractere, le adăugăm pur și simplu la variabila noastră "ElementValue".

- (void) parser: (NSXMLParser *) parser didEndElement: (NSString *) NumeName namespaceURI: (NSString *) namespaceURI qualifiedName: (NSString *) qName {
dacă ([elementName esteEqualToString: @ "element"]) {
[articole addObject: [item copy]];
} altceva {
[element setObject: ElementValue pentruKey: elementName];
}

}

Când am terminat de procesat un element, trebuie să facem una din două lucruri: (1) dacă elementul de sfârșit este "element", am terminat grupul nostru, așa că vom adăuga dicționarul nostru în lista noastră de "articole" “.

Sau (2) dacă elementul nu este "element", vom seta valoarea în dicționarul nostru cu o cheie care corespunde numelui elementului. (Aceasta înseamnă că nu avem nevoie de o variabilă individuală pentru fiecare câmp din fișierul XML. Putem să le procesăm mai puțin dinamic.)

- (void) parserDidEndDocument: (NSXMLParser *) parser {

dacă (errorParsing == NO)
{
NSLog (@ "procesare XML făcut!");
} altceva {
NSLog (@ "Eroare în timpul procesării XML");
}

}

Aceasta este ultima funcție necesară pentru rutina noastră de parsare. Pur și simplu încheie documentul. Veți pune orice cod pe care doriți să terminați procesul aici sau ceva special pe care doriți să-l faceți în caz de eroare.

Un lucru pe care multe aplicații ar putea să o facă aici este salvarea datelor și / sau fișierului XML într-un fișier de pe dispozitiv. În acest fel, în cazul în care utilizatorul nu este conectat la Internet data viitoare când îl încarcă, poate obține informații suplimentare.

Desigur, nu putem uita partea cea mai importantă: a spune aplicației dvs. să analizeze fișierul (și să-i dea o adresă web pentru ao găsi la!).

Pentru a începe procesul, pur și simplu trebuie să adăugați această linie de cod în locul potrivit unde doriți să faceți procesarea XML:

[auto parseXMLFileAtURL: @ "http://www.webaddress.com/file.xml"];