Hvernig á að flokka XML skrár í Xcode

Ein einfalt verkefni sem er burðarás til margra forrita er að geta flutt XML skrár. Og betur fer, Xcode gerir það tiltölulega auðvelt að flokka XML-skrá í Objective-C.

XML- skrá getur innihaldið allt frá grunnupplýsingum um forritið þitt í RSS-straum fyrir vefsíðu. Þeir geta einnig verið frábær leið til að uppfæra upplýsingar innan forritsins lítillega, þannig að framhjá þörfinni fyrir að senda inn nýtt tvöfalt til Apple einfaldlega til að bæta við nýjum hlutum á lista.

Svo hvernig vinnum við XML-skrár í Xcode? Aðferðin inniheldur skref til að frumstilla breytur sem nota skal, hefja XML parser ferlið, fæða það ferli skrá, upphaf einstakra þátta, stafina (gildi) innan þáttarins, lok einstaklings þáttarins og endalokun þáttunarferlisins.

Í þessu dæmi munum við flokka skrá af internetinu með því að senda það tiltekið veffang ( URL ).

Við munum byrja að byggja upp hausskrána. Þetta er dæmi um mjög undirstöðu hausaskrá fyrir smáskoðara með lágmarkskröfur til að flokka skrána okkar:

@interface RootViewController: UITableViewController {
DetailViewController * detailViewController;

NSXMLParser * rssParser;
NSMutableArray * greinar;
NSMutableDictionary * hlutur;
NSString * currentElement;
NSMutableString * ElementValue;
BOOL errorParsing;
}

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

- (ógilt) parseXMLFileAtURL: (NSString *) slóð;

Virkni parseXMLFileAtURL mun hefja ferlið fyrir okkur. Þegar það lýkur mun NSMutableArray "greinar" halda gögnum okkar. Mælikvarðið verður byggt upp af mutable orðabækur með lyklum sem tengjast reitnum í XML-skránni.

Nú þegar við höfum sett upp breytur sem þarf, munum við halda áfram að mæta ferlinu í .m skránum:

- (ógilt) parserDidStartDocument: (NSXMLParser *) parser {
NSLog (@ "Skrá fannst og þáttun byrjaði");

}

Þessi aðgerð er í upphafi ferlisins. Það er engin þörf á að setja neitt í þessari aðgerð, en ef þú vilt framkvæma verkefni þegar skráin fer að flokka, þá er þetta þar sem þú vilt setja kóðann þinn.

- (ógilt) parseXMLFileAtURL: (NSString *) slóð
{

NSString * agentString = @ "Mozilla / 5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en-okkur) AppleWebKit / 525.27.1 (KHTML, eins og Gecko) Útgáfa / 3.2.1 Safari / 525.27.1";
NSMutableURLRequest * beiðni = [NSMutableURLRequest requestWithURL:
[NSURL URLWithString: URL]];
[request setValue: agentString forHTTPHeaderField: @ "User-Agent"];
xmlFile = [NSURLConnection sendSynchronousRequest: beiðni afturReisla: nil villa: nil];


greinar = [[NSMutableArray úthluta] init];
villaParsing = NO;

rssParser = [[NSXMLParser úthluta] initWithData: xmlFile];
[rssParser setDelegate: sjálf];

// Þú gætir þurft að kveikja eitthvað af þessu eftir því hvaða XML-skrá þú notar
[rssParser setShouldProcessNamespaces: NO];
[rssParser setShouldReportNamespacePrefixes: NO];
[rssParser setShouldResolveExternalEntities: NO];

[rssParser flokka];

}

Þessi aðgerð leiðbeinir vélinni um að hlaða niður skrá á tilteknu veffangi (URL) og hefja ferlið til að flokka það.

Við erum að segja að fjarlægur netþjónninn sé Safari með því að keyra á Mac, ef netþjónninn reynir að beina iPhone / iPad í farsímaútgáfu.

Valkostirnir í lokin eru sérstakar fyrir tilteknar XML-skrár. Flestar RSS skrár og almenna XML skrár þurfa ekki að kveikja á þeim.

- (ógilt) flokka: (NSXMLParser *) flokka parseErrorOccurred: (NSError *) parseError {

NSString * errorString = [NSString stringWithFormat: @ "Villa kóða% ég", [parseError code]];
NSLog (@ "Villa flokka XML:% @", errorString);


villaParsing = YES;
}

Þetta er einfalt villuleitunarleiðbeiningar sem mun setja tvöfalt gildi ef það finnur villu. Þú gætir þurft eitthvað meira sérstakt hér eftir því sem þú ert að gera. Ef þú þarft einfaldlega að keyra kóða eftir vinnslu ef um villu er að ræða, þá er hægt að hringja í villaParsing binary breytu á þeim tíma.

- (void) parser: (NSXMLParser *) parser didStartElement: (NSString *) þátturName namespaceURI: (NSString *) namespaceURI qualifiedName: (NSString *) qName eiginleikar: (NSDictionary *) attributeDict {
currentElement = [frumefni afrita];
ElementValue = [[NSMutableString úthluta] init];
ef ([elementName isEqualToString: @ "item"]) {
item = [[NSMutableDictionary alloc] init];

}

}

Kjötið í XML parser inniheldur þrjár aðgerðir, einn sem keyrir í upphafi einstakra þátta, einn sem liggur á miðri þáttun þáttarinnar og einn sem liggur í lok þáttarins.

Í þessu dæmi munum við flokka skrá sem líkist RSS-skrám sem brjóta niður þætti í hópa undir fyrirsögninni "atriði" í XML-skránni. Við upphaf vinnslunnar erum við að leita að heiti hlutarins "hlut" og úthluta hlutaskrá okkar þegar ný hópur er greindur. Annars upphafst við breytu okkar fyrir gildi.

- (ógilt) flokka: (NSXMLParser *) flokka fundustCharacters: (NSString *) strengur {
[ElementValue appendString: strengur];
}

Þetta er auðveld hluti. Þegar við finnum stafir, þá bætum við þeim einfaldlega við breytu okkar "ElementValue".

- (void) parser: (NSXMLParser *) parser didEndElement: (NSString *) þátturName namespaceURI: (NSString *) namespaceURI qualifiedName: (NSString *) qName {
ef ([elementName isEqualToString: @ "item"]) {
[greinar addObject: [atriði afrita]];
} Annar {
[atriði setObject: ElementValue forKey: elementName];
}

}

Þegar við höfum lokið við að vinna frumefni þurfum við að gera eitt af tveimur hlutum: (1) ef endaliðurinn er "hlutur" höfum við lokið hópnum okkar, svo við munum bæta við orðabókinni okkar í fjölda okkar "greinar ".

Eða (2) ef þátturinn er ekki "hlutur" setjum við gildi í orðabók okkar með lykli sem passar við heiti þáttarins. (Þetta þýðir að við þurfum ekki einstakan breytu fyrir hvern reit innan XML-skráarinnar. Við getum unnið þá aðeins betur.)

- (ógilt) parserDidEndDocument: (NSXMLParser *) parser {

ef (villaParsing == NO)
{
NSLog (@ "XML vinnsla lokið!");
} Annar {
NSLog (@ "Villa kom upp við XML vinnslu");
}

}

Þetta er síðasti aðgerðin sem þörf er á fyrir að flokka reglulega. Það endar einfaldlega skjalið. Þú setur hvaða kóða sem þú vilt klára ferlinu hér eða eitthvað sérstakt sem þú gætir viljað gera ef villa er til staðar.

Eitt sem margir forrit gætu viljað gera hér er að vista gögnin og / eða XML skrá í skrá á tækinu. Þannig að ef notandinn er ekki tengdur við internetið næst þegar þeir hlaða appinu, geta þeir samt fengið þessar upplýsingar.

Auðvitað getum við ekki gleymt mikilvægustu hlutanum: Segðu umsókn þína að flokka skrána (og gefa henni veffang til að finna það á!).

Til að hefja ferlið þarftu einfaldlega að bæta þessum kóða við viðeigandi stað þar sem þú vilt gera XML vinnslu:

[sjálf parseXMLFileAtURL: @ "http://www.webaddress.com/file.xml"];