Kif Parse XML Files f'Xcode

Wieħed mill-kompiti sempliċi li huwa s-sinsla għal bosta apps hija l-abbiltà li teżamina l-fajls XML. U, fortunatament, Xcode jagħmilha relattivament faċli biex teżamina fajl XML fl-Objettiv-Ċ.

Fajl XML jista 'jkun fih xi ħaġa minn dejta bażika dwar l-app tiegħek għal RSS feed għal websajt. Jistgħu wkoll ikunu mod tajjeb ħafna biex taġġorna l-informazzjoni fi ħdan l-app tiegħek mill-bogħod, u b'hekk tevita l-ħtieġa li tissottometti binarju ġdid lil Apple sempliċement biex iżżid oġġett ġdid għal-lista.

Allura kif nipproċessaw fajls XML f'Xcode? Il-proċess fih passi biex jiġu inizjati l-varjabbli li għandhom jintużaw, billi tibda l-proċess ta 'parser XML, għalf li jipproċessa fajl, il-bidu ta' element individwali, il-karattri (valur) it-tmiem ta 'element individwali, u t-tmiem tal-proċess tal-analiżi.

F'dan l-eżempju, se nħarsu fajl mill-Internet billi jgħadduh indirizz web partikolari ( URL ).

Se nibdew bil-bini tal-fajl tal-header. Dan huwa eżempju ta 'fajl ta' header bażiku ħafna għal Kontrollur tad-Dettall bir-rekwiżiti minimi għall-analiżi tal-fajl tagħna:

@ interface RootViewController: UITableViewController {
DetailViewController * detailViewController;

NSXMLParser * rssParser;
NSMutableArray * oġġetti;
Oġġett NSMutableDictionary *;
NSString * currentElement;
NSMutableString * ElementValue;
BOOL għall-Ħsad;
}

@ proprjetà (mhux anatomika, iżommu) IBOutlet DetailViewController * detailViewController;

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

Il-funzjoni parseXMLFileAtURL se tibda l-proċess għalina. Meta tispiċċa, l-artikoli "NSMutableArray" se jżommu d-dejta tagħna. L-array se jkun magħmul minn dizzjunarji mutabbli b'ċavi marbuta ma 'l-ismijiet tal-qasam fil-fajl XML.

Issa li konna nwaqqfu l-varjabbli meħtieġa, aħna nimxu 'l quddiem biex nilħqu l-proċess fil-fajl .m:

- (vojt) parserDidStartDocument: (NSXMLParser *) parser {
NSLog (@ "Fajl misjub u analizzat beda");

}

Din il-funzjoni tibda fil-bidu tal-proċess. M'hemmx bżonn li tpoġġi xejn f'din il-funzjoni, imma jekk trid tagħmel xogħol meta l-fajl jibda jiġi analizzat, dan huwa fejn tista 'tpoġġi l-kodiċi tiegħek.

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

NSString * agentString = @ "Mozilla / 5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en-us) AppleWebKit / 525.27.1 (KHTML, bħal Gecko) Version / 3.2.1 Safari / 525.27.1";
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:
[NSURL URLWithString: URL]];
[titlob settValue: agentString forHTTPHeaderField: @ "User-Agent"];
xmlFile = [NSURLConnection sendSynchronousRequest: request returning Risposta: żball żero: xejn];


oġġetti = [[NSMutableArray alloc] init];
errorParsing = LE;

rssParser = [[NSXMLParser alloc] initWithData: xmlFile];
[rssParser setDelegate: awto];

// Jista 'jkollok bżonn tibdel uħud minn dawn jiddependi mit-tip ta' fajl XML li qed tħejji
[rssParser setShouldProcessNamespaces: LE];
[rssParser setShouldReportNamespacePrefixes: LE];
[Ir-Riżorsi tas-Sajf setgħu jirrisolvu l-Istituzzjonijiet ta 'Barra: LE];

[rssParser parse];

}

Din il-funzjoni tagħti struzzjonijiet lill-magna biex tniżżel fajl f'indirizz tal-web partikolari (URL) u tibda l-proċess biex tiskopriha.

Aħna ngħidu lis-server remot li aħna Safari qed taħdem fuq Mac biss f'każ li s-server jipprova jbiddel l- iPhone / iPad għal verżjoni mobbli.

L-għażliet fl-aħħar huma speċifiċi għal ċerti fajls XML. Ħafna mill-fajls RSS u fajls XML ġeneriċi ma jkollhomx bżonnhom mixgħula.

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

NSString * errorString = [NSString stringWithFormat: @ "Kodiċi ta 'l-iżball% i", [parseError code]];
NSLog (@ "Error parsing XML:% @", errorString);


żballParsing = IVA;
}

Dan huwa sempliċi routing tal-iċċekkjar tal-iżbalji li se jiffissa valur binarju jekk jiltaqa 'ma' żball. Jista 'jkollok bżonn xi ħaġa iktar speċifika hawn skond x'qed tagħmel. Jekk sempliċiment għandek bżonn li tmexxi xi kodiċi wara l-ipproċessar fil-każ ta 'żball, il-varjabbli binarja ta' żballParsing tista 'tissejjaħ dak iż-żmien.

- (invalid) parser: (NSXMLParser *) parser didStartElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI kwalifikataName: (NSString *) qName attributi: (NSDictionary *) attributDict {
currentElement = [il-kopja elementName];
ElementValue = [[NSMutableString alloc] init];
jekk ([elementName huwaEqualToString: @ "oġġett"]) {
oġġett = [[NSMutableDictionary alloc] init];

}

}

Il-laħam tal-parser XML fih tliet funzjonijiet, waħda li tibda fil-bidu ta 'element individwali, wieħed li jmur fin-nofs tal-analiżi tal-element, u dik li tmur fit-tarf tal-element.

Għal dan l-eżempju, se nħarsu fajl simili għal fajls RSS li jgħaqqdu elementi fi gruppi taħt l-intestatura ta '"oġġetti" fi ħdan il-fajl XML. Fil-bidu tal-ipproċessar, qed niċċekkjaw l-isem tal-element "oġġett" u nallokaw id-dizzjunarju tal-oġġett tagħna meta jinstab grupp ġdid. Inkella, aħna nibdew il-varjabbli tagħna għall-valur.

- parser (vojt): (NSXMLParser *) parser misjuba Persuni: (NSString *) string {
[ElementValue appendString: spag];
}

Din hija l-parti faċli. Meta insibu karattri, aħna sempliċement inżidhom mal-varjabbli "ElementValue" tagħna.

- (invalid) parser: (NSXMLParser *) parser didEndElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI kwalifikataName: (NSString *) qName {
jekk ([elementName huwaEqualToString: @ "oġġett"]) {
[oġġetti addObject: [kopja ta 'oġġett]];
} ieħor {
[item setObject: ElementValue forKey: elementName];
}

}

Meta aħna lestejna l-ipproċessar ta 'element, għandna bżonn nagħmlu waħda minn żewġ affarijiet: (1) jekk l-element finali huwa "oġġett", aħna lestejna l-grupp tagħna, hekk aħna niżdiedu d-dizzjunarju tagħna fil-firxa tagħna ta' "artikli ".

Jew (2) jekk l-element mhuwiex "oġġett", aħna nispjegaw il-valur fid-dizzjunarju tagħna b'kelma li taqbel ma 'l-isem ta' l-element. (Dan ifisser li m'għandniex bżonn ta 'varjabbli individwali għal kull qasam fi ħdan il-fajl XML. Nistgħu nipproċessawhom ftit aktar b'mod dinamiku.)

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

jekk (errorParsing == LE)
{
NSLog (@ "Proċessar XML magħmul!");
} ieħor {
NSLog (@ "Ġara żball waqt l-ipproċessar tal-XML");
}

}

Din hija l-aħħar funzjoni meħtieġa għar-rutina tal-analiżi tagħna. Hija sempliċiment tispiċċa d-dokument. Int ser tpoġġi kwalunkwe kodiċi li tixtieq tispiċċa l-proċess hawn jew xi ħaġa speċjali li tista 'tixtieq tagħmel f'każ ta' żball.

Ħaġa waħda li ħafna apps jistgħu jixtiequ li jagħmlu hawn hija li tiffranka d-data u / jew il-fajl XML għal fajl fuq l-apparat. B'dan il-mod, jekk l-utent ma jkunx imqabbad ma 'l-Internet il-ħin li jmiss iġorr l-app, xorta jistgħu jsibu din l-informazzjoni.

Naturalment, ma nistgħux ninsew l-aktar parti importanti: tgħid l-applikazzjoni tiegħek biex tanalizza l-fajl (u tagħtih indirizz tal-internet biex issibha!).

Biex tibda l-proċess, għandek sempliċement iżżid din il-linja tal-kodiċi mal-post xieraq fejn trid tagħmel l-ipproċessar tal-XML:

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