Kako analizirati XML datoteke u Xcode

Jedan jednostavan zadatak koji je okosnica mnogim aplikacijama jest sposobnost analiziranja XML datoteka. I, na sreću, Xcode čini relativno lako analizirati XML datoteku u Objective-C.

XML datoteka može sadržavati sve iz osnovnih podataka o vašoj aplikaciji na RSS feed za web stranicu. Oni također mogu biti odličan način za ažuriranje informacija u vašoj aplikaciji na daljinu, a time zaobilazeći potrebu za slanje novog binarnog sadržaja Appleu jednostavno dodavanjem nove stavke na popis.

Dakle, kako obrađujemo XML datoteke u Xcode-u? Proces sadrži korake za inicijalizaciju varijabli koje treba koristiti, pokretanje procesa XML parser, hranjenje tog procesa datoteka, početak pojedinačnog elementa, znakovi (vrijednosti) unutar elementa, kraj pojedinog elementa, i kraj procesa raščlanjivanja.

U ovom ćemo primjeru analizirati datoteku s Interneta tako što ćemo je dodijeliti određenoj web-adresi ( URL-u ).

Početi ćemo s izradom datoteke zaglavlja. Ovo je primjer vrlo osnovne datoteke zaglavlja za kontroler detaljnog pregleda s minimalnim zahtjevima za analizu datoteke:

@interface RootViewController: UITableViewController {
DetailViewController * detailViewController;

NSXMLParser * rssParser;
NSMutableArray * članci;
NSMutableDictionary * stavka;
NSString * currentElement;
NSMutableString * ElementValue;
BOOL errorParsing;
}

@property (nonatomic, zadržati) IBOutlet DetailViewController * detailViewController;

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

ParseXMLFileAtURL funkcija će započeti proces za nas. Kada završi, NSMutableArray "članci" čuvaju naše podatke. Polje će se sastojati od promjenjivih rječnika s ključevima povezanim s nazivima polja u XML datoteci.

Sada kada smo postavili potrebne varijable, premjestit ćemo se na postupak postupka u .m datoteci:

- (void) parserDidStartDocument: (NSXMLParser *) parser {
NSLog (@ "Zapis pronađen i analiza datoteke pokrenut");

}

Ta se funkcija izvodi na početku postupka. Ne morate ništa staviti u ovu funkciju, ali ako želite izvršiti zadatak kada se datoteka počne analizirati, ovdje biste stavili kôd.

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

NSString * agentString = @ "Mozilla / 5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en-us) AppleWebKit / 525.27.1 (KHTML, kao što je Gecko) Verzija / 3.2.1 Safari / 525.27.1";
NSMutableURLRequest * request = [NSMutableURLRekvatni zahtjevWithURL:
[NSURL URLWithString: URL]];
[zahtjev setValue: agentString zaHTTPHeaderField: @ "Korisnički agent"];
xmlFile = [NSURLCconnection sendSynchronousRequest: povrat zahtjevaResponse: nil error: nil];


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

rssParser = [[NSXMLParser dodijeliti] initWithData: xmlFile];
[rssParšir setDelegate: samo];

// Možda ćete morati uključiti neke od njih, ovisno o vrsti XML datoteke koju raščlanite
[rssParšir setShouldProcessNamespaces: NO];
[rssParšir setShouldReportNamespacePrefixes: NO];
[rssParšir setShouldResolveExternalEntities: NO];

[rssParširni parsiranje];

}

Ova funkcija upućuje motoru da preuzme datoteku na određenoj web-adresi (URL) i pokrenuti postupak za analizu.

Kažemo udaljenom poslužitelju da smo Safari koji se izvodi na Macu samo u slučaju da poslužitelj pokuša preusmjeriti 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će ih trebati uključiti.

- (praznik) parser: (NSXMLParser *) Parser parseErrorOccurred: (NSError *) parseError {

NSString * errorString = [NSString stringWithFormat: @ "Šifra pogreške% i", [šifra parseError]];
NSLog (@ "Pogreška pri parsiranju XML:% @", errorString);


errorParsing = DA;
}

Ovo je jednostavan usmjeravanje pogrešaka koji će postaviti binarnu vrijednost ako se pojavi pogreška. Možda će vam trebati nešto specifičnije, ovisno o tome što radite. Ako jednostavno trebate pokrenuti neki kod nakon obrade u slučaju pogreške, binarna varijabla errorParsing može se nazvati u to vrijeme.

(NSXMLParser *) parser didStartElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI qualifiedName: (NSString *) qName atributi: (NSDictionary *) atributDict {
currentElement = [elementName kopija];
ElementValue = [[NSMutableString dodijeliti] init];
ako ([elementName isEqualToString: @ "stavka"]) {
stavka = [[NSMutableDictionary dodijeliti] init];

}

}

Meso XML parsera sadrži tri funkcije, jedna koja se pokreće na početku pojedinačnog elementa, jedan koji se izvodi u sredini parsiranja elementa i jedan koji radi na kraju elementa.

Za ovaj primjer ćemo analizirati datoteku sličnu RSS datotekama koje razgrađuju elemente u grupe ispod zaglavlja "stavki" unutar XML datoteke. Na početku obrade provjeravamo naziv elementa "stavka" i dodjeljujemo naš rječnik stavki kada je otkrivena nova grupa. Inače, inicijaliziramo našu varijablu za vrijednost.

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

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

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

}

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

Ili (2) ako element nije "stavka", vrijednost ćemo u našem rječniku postaviti ključem koji odgovara nazivu elementa. (To znači da ne trebamo pojedinačnu varijablu za svako polje unutar XML datoteke. Možemo ih obraditi malo dinamički.)

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

ako (errorParsing == NE)
{
NSLog (@ "Obrada XML procesa!");
} else {
NSLog (@ "Došlo je do pogreške prilikom obrade XML-a");
}

}

Ovo je posljednja funkcija koja je potrebna za našu rutinsku analizu. Jednostavno završava dokument. Stavit ćete bilo koji kôd koji želite završiti proces ovdje ili bilo što posebno što biste htjeli učiniti u slučaju pogreške.

Jedna stvar koju mnoge aplikacije možda želi učiniti jest spremiti podatke i / ili XML datoteku u datoteku na uređaju. Na taj način, ako korisnik nije povezan s internetom sljedeći put kada učitaju aplikaciju, još uvijek mogu dobiti ove informacije.

Naravno, ne možemo zaboraviti najvažniji dio: priopćiti vašu aplikaciju da analizira datoteku (i dajući joj web adresu da ga pronađe!).

Da biste pokrenuli postupak, jednostavno trebate dodati ovu liniju koda na odgovarajuće mjesto gdje želite izvršiti obradu XML-a:

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