Kaip parinkti XML failus Xcode

Viena paprasta užduotis, kuri yra daugelio programų pagrindas, yra sugebėjimas paralyžiuoti XML failus. Laimei, "Xcode" leidžia palyginti lengvai ištirti XML-bylą "Objective-C".

XML rinkmenoje gali būti nieko nuo pagrindinių jūsų programos duomenų iki svetainės RSS . Jie taip pat gali būti puikus būdas atnaujinti informaciją savo programoje nuotoliniu būdu, tokiu būdu išvengiant poreikio pateikti naują dvejetainę programą "Apple", tiesiog įtraukiant į sąrašą naują elementą.

Taigi, kaip mes apdorojame XML failus Xcode? Procesas apima veiksmus, skirtus kintamųjų, kurie bus naudojami, paleidimui, pradedant XML parsero procesą, šio proceso failą, atskirų elementų pradžią, simbolius (vertę) elemento viduje, atskirų elementų pabaiga ir analizavimo proceso pabaiga.

Šiame pavyzdyje mes susisteminsime failą iš interneto, perduodame tam tikrą žiniatinklio adresą ( URL ).

Pradėsime kurti antraštės failą. Tai yra labai paprasto antraštės failo pavyzdys, skirtas detalių peržiūrų valdikliui, kurio minimalūs reikalavimai yra mūsų failo analizavimui:

@interface RootViewController: UITableViewController {
DetailViewController * detailViewController;

NSXMLParser * rssParser;
NSMutableArray * straipsniai;
NSMutableDictionary * elementas;
NSString * currentElement;
NSMutableString * ElementValue;
BOOL errorParsing;
}

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

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

ParseXMLFileAtURL funkcija pradės mums procesą. Kai baigsite, "NSMutableArray" straipsniai laikys mūsų duomenis. Masyvas bus sudarytas iš permainingų žodynų su raktais, susijusiais su laukų pavadinimais XML rinkmenoje.

Dabar, kai mes nustatėme reikalingus kintamuosius, mes pereisime prie proceso, kuris atitinka .m failą:

- (negaliojantis) parserDidStartDocument: (NSXMLParser *) analizatorius {
NSLog (@ "Rastas failas ir pradėtas analizavimas");

}

Ši funkcija prasideda proceso pradžioje. Šioje funkcijoje nereikia nieko dėti, tačiau jei norite atlikti užduotį, kai failas pradedamas analizuoti, tai kur jūs įvedėte savo kodą.

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

NSString * agentString = @ "Mozilla / 5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en-us); AppleWebKit / 525.27.1 (KHTML, Gecko); Version / 3.2.1 Safari / 525.27.1";
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:
[NSURL URLWithString: URL]];
[request setValue: agentString forHTTPHeaderField: @ "User-Agent"];
xmlFile = [NSURLConnection sendSynchronousRequest: request returningResponse: nil error: nil];


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

rssParser = [[NSXMLParser alloc] initWithData: xmlFile];
[rssParser setDelegate: savarankiškai];

/ / Jums gali tekti keisti kai kurias iš jų priklausomai nuo rūšies XML failo, kurį analizuojate
[rssParser setShouldProcessNamespaces: NO];
[rssParser setShouldReportNamespacePrefixes: NO];
[rssParser setShouldResolveExternalEntities: NO];

[rssParser parse];

}

Ši funkcija nurodo varikliui atsisiųsti failą tam tikrame interneto adresu (URL) ir pradėti analizuoti jį.

Mes sakome nuotoliniam serveriui, kad esame Safari, kuriame veikia Mac, tik tuo atveju, jei serveris bando nukreipti iPhone / iPad į mobilią versiją.

Pabaigos variantai būdingi tam tikriems XML failams. Daugeliui RSS failų ir bendrojo pobūdžio XML rinkmenų nebūtina jų įjungti.

- (negaliojantis) analizatorius: (NSXMLParser *) analizatorius parseErrorOccurred: (NSError *) parseError {

NSString * errorString = [NSString stringWithFormat: @ "Klaidos kodas% i", [parseError code]];
NSLog (@ "Klaida analizuojant XML:% @", errorString);


errorParsing = YES;
}

Tai paprastas klaidų tikrinimo maršrutas, kuris nustatys dvejetainę reikšmę, jei iškiltų klaida. Jums gali prireikti kažko konkretesnio, priklausomai nuo to, ką jūs darote. Jei klaidos atveju paprasčiausiai reikia paleisti tam tikrą kodą po apdorojimo, binarinis kintamasis errorParsing gali būti vadinamas tuo metu.

(NSString *) qName atributai: (NSDictionary *) attributeDict {(NSS)} * (parašas): (NSXMLParser *) parser didStartElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI qualifiedName:
currentElement = [elementName kopija];
ElementValue = [[NSMutableString alloc] init];
jei ([elementName isEqualToString: @ "item"]) {
item = [[NSMutableDictionary alloc] init];

}

}

XML parserio masei yra trys funkcijos: viena - tai atskiro elemento pradžia, viena, kuri prasideda analizuojant elementą, ir tas, kuris prasideda elemento gale.

Pavyzdžiui, mes analizuojame failą, panašų į RSS failus, kurie suskaido elementus į grupes po antrašte "elementai" XML byloje. Atliekant apdorojimo procesą, mes tikriname elemento pavadinimą "elementas" ir priskiria mūsų elemento žodyną, kai nustatoma nauja grupė. Priešingu atveju, inicializuojame savo kintamąjį vertės.

- (negaliojantis) analizatorius: (NSXMLParser *) parseratorius rasti charakteriai: (NSString *) eilutė {
[ElementValue appendString: eilutė];
}

Tai lengva dalis. Kai randame simbolių, mes tiesiog pridedame juos prie mūsų kintamojo "ElementValue".

(NSString *) namespaceURI qualifiedName: (NSString *) qName {(NSString *))
jei ([elementName isEqualToString: @ "item"]) {
[articles addObject: [copy item]];
} Kitas {
[item setObject: ElementValue forKey: elementName];
}

}

Kai baigsime apdoroti elementą, turime padaryti vieną iš dviejų dalykų: (1) jei galutinis elementas yra "elementas", mes baigėme mūsų grupę, todėl mūsų žodyną pridėsime į mūsų "straipsnių rinkinį" "

Arba (2) jei elementas nėra "elementas", žodyno reikšmė bus nustatyta raktu, kuris atitinka elemento pavadinimą. (Tai reiškia, kad mums nereikia atskirų kintamųjų kiekvienam laukui XML rinkmenoje. Galime juos apdoroti šiek tiek dinamiškiau.)

- (negaliojantis) parserDidEndDocument: (NSXMLParser *) analizatorius {

if (errorParsing == NO)
{
NSLog (@ "XML processing done!");
} Kitas {
NSLog (@ "XML apdorojimo metu įvyko klaida");
}

}

Tai paskutinė funkcija, reikalinga mūsų analizuojamojoje tvarkoje. Tai paprasčiausiai baigiasi dokumentas. Jūs įdėsite bet kokį kodą, į kurį norite užbaigti procesą čia, arba ką nors ypatingą, kurį galbūt norėsite daryti klaidos atveju.

Čia daugelis programų, galbūt norėsite tai padaryti, yra išsaugoti duomenis ir (arba) XML rinkmeną į įrenginio failą. Tokiu būdu, jei vartotojas kitą kartą įkels programą, jis nebus prijungtas prie interneto, tačiau vis tiek gali gauti šią informaciją.

Žinoma, negalime pamiršti svarbiausios dalies: pasakojame jūsų paraišką, kad galėtume suskaidyti failą (ir pateikdami jį žiniatinklio adresą, kad jį surastumėte!).

Norėdami pradėti procesą, paprasčiausiai turite pridėti šią kodo eilutę į atitinkamą vietą, kurioje norite atlikti XML apdorojimą:

[savarankiškai parseXMLFileAtURL: @ "http://www.webaddress.com/file.xml"];