Kako izvesti XML datoteke u Xcode

Jednostavan zadatak koji je okosnica mnogim aplikacijama je mogućnost razdvajanja XML datoteka. I, srećom, Xcode čini relativno lako analizirati XML datoteku u Objective-C.

XML datoteka može sadržati bilo šta od osnovnih podataka o vašoj aplikaciji do RSS feed-a za web lokaciju. Oni takođe mogu biti odličan način daljinskog ažuriranja informacija u vašoj aplikaciji, tako da zaobiđu potrebu da se Appleu pošalje nova binarna datoteka jednostavno za dodavanje nove stavke na listu.

Dakle, kako obrađujemo XML datoteke u Xcode-u? Proces sadrži korake za inicijalizaciju varijabli koje će se koristiti, započinjanje procesa XML parser-a, dovodeći taj proces datoteku, početak pojedinačnog elementa, karaktera (vrijednost) unutar elementa, kraj pojedinačnog elementa i kraj procesa razaranja.

U ovom primjeru ćemo razjasniti datoteku sa Interneta tako što ćemo mu prenijeti određenu web adresu ( URL ).

Počećemo sa izradom datoteke zaglavlja. Ovo je primer veoma osnovne datoteke zaglavlja za Detail View Controller sa minimalnim zahtevima za razradu našeg fajla:

@interface RootViewController: UITableViewController {
DetailViewController * detailViewController;

NSXMLParser * rssParser;
NSMutableArray * članke;
NSMutableDictionary * item;
NSString * currentElement;
NSMutableString * ElementValue;
BOOL errorParsing;
}

@property (neatomski, zadrži) IBOutlet DetailViewController * detailViewController;

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

Funkcija parseXMLFileAtURL će započeti proces za nas. Kada završi, NSMutableArray "članci" će zadržati naše podatke. Niz će biti sastavljen od promenljivih rečnika sa ključevima vezanim za imena polja u XML datoteci.

Sada kada smo postavili potrebne varijable, prelazimo na sastanak procesa u .m datoteku:

- (void) parserDidStartDocument: (NSXMLParser *) parser {
NSLog (@ "Pronađeni fajl i aktiviranje parsinga");

}

Ova funkcija radi na početku procesa. Nema potrebe ništa staviti u ovu funkciju, ali ako želite izvršiti zadatak kada datoteka počne da se analizira, ovde ćete staviti svoj kod.

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

NSString * agentString = @ "Mozilla / 4.0 (compatible; MSIE 8.0; Windows NT 5.1;
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:
[NSURL URLWithString: URL]];
[zahtev setValue: agentString forHTTPHeaderField: @ "Korisnički agent"];
xmlFile = [NSURLConnection sendSynchronousRequest: zahtev za vraćanjeResponse: nil greška: nil];


članci = [[NSMutableArray alloc] init];
errorParsing = NE;

rssParser = [[NSXMLParser alloc] initWithData: xmlFile];
[rssParser setDelegacija: samo];

// Možda ćete morati da uključite neke od njih u zavisnosti od tipa XML datoteke koju analizirate
[rssParser setShouldProcessNamespaces: NE];
[rssParser setShouldReportNamespacePrefixes: NE];
[rssParser setShouldResolveExtremeEntities: NE];

[rssParser parse];

}

Ova funkcija instruiše motor da preuzme datoteku na određenoj web adresi (URL) i započne postupak za njegovo pariziranje.

Govorimo udaljenom serveru da smo Safari koji radi na Mac-u samo u slučaju da server pokuša preusmeriti iPhone / iPad na mobilnu verziju.

Opcije na kraju su specifične za određene XML datoteke. Većina RSS datoteka i generičkih XML datoteka ne moraju da budu uključeni.

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

NSString * errorString = [NSString stringWithFormat: @ "Kod greške% i", [parseError code]];
NSLog (@ "Greška pri razgraničavanju XML-a:% @", errorString);


errorParsing = YES;
}

Ovo je jednostavno rutiranje za proveru grešaka koje će postaviti binarnu vrijednost ako se susreće sa greškom. Možda će vam trebati nešto konkretnije u zavisnosti od onoga što radite. Ako jednostavno morate pokrenuti neki kôd nakon obrade u slučaju greške, u tom trenutku može se pozvati binarna varijabla errorParsing.

- (void) parser: (NSXMLParser *) parser didStartElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI kvalifikovano ime: (NSString *) qName atributi: (NSDictionary *) atributDict {
currentElement = [elementName copy];
ElementValue = [[NSMutableString raspored] init];
ako ([elementName jeEqualToString: @ "stavka"])) {
item = [[NSMutableDictionary alloc] init];

}

}

Meso XML parsera sadrži tri funkcije, one koje se pokreću na početku pojedinačnog elementa, onaj koji se odvija u toku razdvajanja elementa i onaj koji se pokreće na kraju elementa.

Za ovaj primjer, razradićemo datoteku sličnu datotekama RSS koje razgrađuju elemente u grupe pod naslovom "stavke" unutar XML datoteke. Na početku obrade, proveravamo ime elementa "stavka" i dodeljujemo naš rečnik rečenice kada se otkrije nova grupa. Inače, inicijaliziramo našu varijablu za vrijednost.

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

Ovo je jednostavan deo. Kada nađemo likove, jednostavno ih dodamo u našu varijablu "ElementValue".

- (void) parser: (NSXMLParser *) parser didEndElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI kvalifikovano ime: (NSString *) qName {
ako ([elementName jeEqualToString: @ "stavka"])) {
[članci addObject: [stavka artikla]];
} else {
[item setObject: ElementValue forKey: elementName];
}

}

Kada završimo sa obradom elementa, moramo učiniti jednu od dve stvari: (1) ako je krajnji element "stavka", završili smo našu grupu, tako da ćemo dodati naš rječnik u naš niz "članaka ".

Ili (2) ako element nije "stavka", postavićemo vrijednost u našem rječniku s ključem koji odgovara imenu elementa. (Ovo znači da nam ne treba individualna varijabla za svako polje unutar XML datoteke. Možemo ih procesirati malo dinamičnije.)

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

ako (errorParsing == NE)
{
NSLog (@ "XML obrada obavljena!");
} else {
NSLog (@ "Došlo je do greške tokom XML obrade");
}

}

Ovo je zadnja funkcija potrebna za našu rutinu proučavanja. Jednostavno završava dokument. Ovde ćete staviti bilo koji kod koji želite završiti ovde, ili nešto posebno koje biste želeli da uradite u slučaju greške.

Jedna stvar koju bi mnoge aplikacije možda želele ovde je da sačuvate podatke i / ili XML datoteku u datoteku na uređaju. Na taj način, ako korisnik ne bude povezan na Internet sledeći put kada učitavaju aplikaciju, oni i dalje mogu dobiti ove informacije.

Naravno, ne možemo zaboraviti najvažniji deo: priča vašoj aplikaciji da razbije fajl (i dajući mu web adresu da ga pronađe!).

Da biste započeli proces, jednostavno morate dodati ovu liniju koda na odgovarajuće mjesto gdje želite da obradite XML:

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