Si të analizosh skedarët XML në Xcode

Një detyrë e thjeshtë që është shtylla kurrizore për shumë aplikacione është aftësia për të analizuar skedarët XML. Dhe, për fat të mirë, Xcode e bën relativisht të lehtë për të analizuar një skedar XML në Objektivin C.

Një skedar XML mund të përmbajë diçka nga të dhënat bazë në lidhje me aplikacionin tuaj në një RSS për një faqe interneti. Ata gjithashtu mund të jenë një mënyrë e madhe për përditësimin e informacionit brenda aplikacionit tuaj në distancë, duke anashkaluar kështu nevojën për të paraqitur një binar të ri në Apple thjesht për të shtuar një artikull të ri në një listë.

Pra, si do të përpunojmë skedarët XML në Xcode? Procesi përmban hapa për inicializimin e variablave që do të përdoren, duke filluar procesin e parser XML, duke ushqyer atë proces një skedar, fillimin e një elementi individual, karakteret (vlera) brenda elementit, fundi i një elementi individual, dhe fundi i procesit të analizës.

Në këtë shembull, ne do të analizojmë një skedar nga Interneti duke e kaluar një adresë të caktuar web ( URL ).

Do të fillojmë me ndërtimin e skedarit të kokës. Ky është një shembull i një skedari header shumë themelor për një Kontrollues të Detajimit të Detajuar me kërkesat minimale për analizën e skedarit tonë:

@interface RootViewController: UITableViewController {
DetailViewController * detailViewController;

NSXMLParser * rssParser;
Artikuj NSMutableArray *;
NSMutableDictionary * pika;
NSString * currentElement;
NSMutableString * ElementValue;
BOOL errorParsing;
}

@property (nonatomic, mbaj) IBOutlet DetailViewController * detailViewController;

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

Funksioni parseXMLFileAtURL do të fillojë procesin për ne. Kur përfundon, artikujt NSMutableArray do të mbajnë të dhënat tona. Grupi do të përbëhet nga fjalorë të ndryshueshëm me çelësa që lidhen me emrat e fushave në skedarin XML.

Tani që ne kemi ngritur variablave të nevojshëm, do të shkojmë përpara në procesin e procesit në skedarin .m:

- (void) parserDidStartDocument: (NSXMLParser *) parser {
NSLog (@ "Dosja e gjetur dhe parsing e filluar");

}

Ky funksion shkon në fillim të procesit. Nuk ka nevojë të vendosni ndonjë gjë në këtë funksion, por nëse doni të kryeni një detyrë kur skedari fillon të analizohet, ky është vendi ku do të vendosni kodin tuaj.

- (zbrazët) parseXMLFileAtURL: (NSString *) URL
{

NSString * agentString = @ "Mozilla / 5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en-us) AppleWebKit / 525.27.1 (KHTML, si Gecko) Versioni / 3.2.1 Safari / 525.27.1";
NSMutableURLRequest * request = [NSMutableURL Kërkesa KërkesaWithURL:
[NSURL URLWithString: URL]];
[kërkesa setValue: agentString forHTTPHeaderField: @ "User-Agent"];
xmlFile = [NSURLCconnection sendSynchronousRequest: kërkesa returningResponse: zero error: nil];


artikuj = [[NSMutableArray alloc] init];
errorParsing = NO;

rssParser = [[NSXMLParser alokimi] initWithData: xmlFile];
[rssParser setDelegate: vetë];

// Mund t'ju duhet të ndiqni disa nga këto në varësi të llojit të skedarit XML që po analizoni
[rssParser setShouldProcessNamespaces: JO];
[rssParser setShouldReportNamespacePrefixes: JO];
[rssParser setShouldResolveExternalEntities: JO];

[rssParser parse];

}

Ky funksion udhëzon motorin të shkarkojë një skedar në një adresë të caktuar të internetit (URL) dhe të fillojë procesin për të analizuar atë.

Ne po u themi serverit të largët se ne jemi një Safari që funksionon në Mac vetëm në rast se serveri përpiqet të përcjellë iPhone / iPad në një version celular.

Opsionet në fund janë specifike për disa skedarë XML. Shumica e skedarëve RSS dhe skedarëve gjenerikë XML nuk do të kenë nevojë që ato të ndizen.

- (zbrazët) parser: (NSXMLParser *) Parser parseErrorOccurred: (NSError *) parseError {

NSString * errorString = [NSString stringWithFormat: @ "Kodi i gabimit% i", [parseError code]];
NSLog (@ "Gabim në analizimin e XML:% @", errorString);


errorParsing = PO;
}

Ky është një kurs i thjeshtë i kontrollit të gabimeve që do të vendosë një vlerë binare nëse ndesh një gabim. Ju mund të keni nevojë për diçka më specifike këtu në varësi të asaj që po bëni. Nëse thjesht duhet të kryesh një kod pas përpunimit në rastin e gabimit, mund të thirret ndryshuesi binar i gabimit në atë kohë.

(NSXMLParser *) parser didStartElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI qualifiedName: (NSString *) Atribute qName: (NSDictionary *) atributDict {
currentElement = [elementName copy];
ElementValue = [[NSMutableString alloc] init];
nëse ([elementName isEqualToString: @ "item"]) {
pika = [[NSMutableDictionary alloc] init];

}

}

Mishi i parser XML përmban tre funksione, një që shkon në fillim të një elementi individual, ai që shkon në mes të analizës së elementit dhe një që shkon në fund të elementit.

Për këtë shembull, ne do të analizojmë një skedar të ngjashëm me skedarët e RSS që prishin elementet në grupe nën titullin e "artikujve" brenda skedarit XML. Në fillim të përpunimit, po kontrollojmë për emrin e elementit "artikull" dhe ndarjen e fjalorit tonë të artikullit kur zbulohet një grup i ri. Përndryshe, inicializojmë variablin tonë për vlerën.

- (zbrazët) parser: (NSXMLParser *) parser foundCharacters: (NSString *) string {
[ElementValue appendString: string];
}

Kjo është pjesa e lehtë. Kur gjejmë karaktere, thjesht i shtojmë ato në variablin tonë "ElementValue".

- (void) parser: (NSXMLParser *) parser didEndElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI qualifiedName: (NSString *) qName {
nëse ([elementName isEqualToString: @ "item"]) {
[artikuj addObject: [item copy]];
} tjetër {
[item setObject: ElementValue forKey: elementName];
}

}

Kur ne kemi përfunduar përpunimin e një elementi, ne duhet të bëjmë një nga dy gjëra: (1) nëse elementi fund është "artikull", ne kemi përfunduar grupin tonë, kështu që ne do të shtojmë fjalorin tonë në grupin tonë të "artikujve ".

Ose (2) nëse elementi nuk është "artikull", ne do të vendosim vlerën në fjalorin tonë me një çelës që përputhet me emrin e elementit. (Kjo do të thotë që ne nuk kemi nevojë për një ndryshore individuale për secilën fushë brenda skedarit XML. Mund t'i përpunojmë ato pak më dinamike.)

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

nëse (ErrorParsing == JO)
{
NSLog (@ "Përpunimi XML bërë!");
} tjetër {
NSLog (@ "Gabim gjatë përpunimit XML");
}

}

Ky është funksioni i fundit i nevojshëm për rutinë tonë të analizës. Ajo thjesht përfundon dokumentin. Ju do të vendosni ndonjë kod që dëshironi të përfundoni procesin këtu ose ndonjë gjë të veçantë që mund të dëshironi të bëni në rast të gabimit.

Një gjë që shumë aplikacione mund të dëshirojnë të bëjë këtu është ruajtja e të dhënave dhe / ose skedarit XML në një skedar në pajisje. Në këtë mënyrë, nëse përdoruesi nuk është i lidhur me internet herën tjetër që e ngarkojnë aplikacionin, ata ende mund të marrin këtë informacion.

Natyrisht, nuk mund ta harrojmë pjesën më të rëndësishme: duke treguar aplikacionin tuaj për të analizuar dosjen (dhe duke i dhënë një adresë të internetit për ta gjetur atë!).

Për të filluar procesin, thjesht duhet të shtoni këtë rresht të kodit në vendin e duhur ku dëshironi të bëni përpunimin XML:

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