Kuidas XML-failide Xcode'is parsida

Üks lihtne ülesanne, mis on mitme rakenduse selgroog, on XML-failide parsimine. Õnneks on Xcode suhteliselt lihtne XML-faili parsida Objective-C-s.

XML- fail võib sisaldada midagi teie rakenduse põhiandmetest veebisaidi RSS-voogu . Samuti võivad need olla suurepärane viis oma rakenduses oleva teabe ajakohastamiseks kaugjuhtimisega, mistõttu tuleb uuele binaarile Apple'ile lihtsalt lisada, et lisada uus üksus loendisse.

Niisiis, kuidas me töötleme XML-faile Xcode'is? Protsess sisaldab toimetatavaid muutujaid initsialiseerimiseks, XML-parseri protsessi käivitamist, selle protsessi toomist faili, individuaalse elemendi algust, elementidest (väärtust) individuaalse elemendi lõpp ja analüüsimisprotsessi lõpp.

Selles näites analüüsime faili Internetist, edastades selle konkreetse veebiaadressi ( URL ).

Alustame päisefaili loomisega. See on näide üksikasjaliku vaatamise kontrolleri väga põhilisest päisefailist meie faili parsimise miinimumnõuetega:

@interface RootViewController: UITableViewController {
DetailViewController * detailViewController;

NSXMLParser * rssParser;
NSMutableArray * artiklid;
NSMutableDictionary * objekt;
NSString * currentElement;
NSMutableString * ElementValue;
BOOL errorParsing;
}

@ omandiõigus (mitte-aatomiline, säilitada) IBOutlet DetailViewController * detailViewController;

- (tühine) parseXMLFileAtURL: (NSString *) URL;

ParsXMLFileAtURL funktsioon käivitab meie jaoks protsessi. Kui see lõpeb, säilitavad meie andmed "NSMutableArray" artiklid. Massiiv koosneb erinevatest sõnastikest koos klahvidega, mis on seotud XML-faili väljadel olevate nimedega.

Nüüd, kui oleme seadistanud vajalikud muutujad, liigume edasi protsessi kohtumiseks .m-failis:

- (tühine) parserDidStartDocument: (NSXMLParser *) parser {
NSLog (@ "File found and parsing started");

}

See funktsioon käivitub protsessi alguses. Selles funktsioonis ei ole midagi vaja, aga kui soovite faili hakata parsima, peate selle koodi panema.

- (tühine) parseXMLFileAtURL: (NSString *) URL
{

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


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

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

/ / Võib-olla peate mõned neist muutma sõltuvalt XML-faili tüübist, mida te parsite
[rssParser setShouldProcessNamespaces: EI];
[rssParser setShouldReportNamespacePrefixes: NO];
[rssParser setShouldResolveExternalEntities: EI];

[rssParser pars];

}

See funktsioon juhendab mootorit faili alla laadima teatud veebiaadressil (URL) ja alustama selle analüüsimist.

Me ütleme kaugserverile, et me kasutame Macis Safari, kui server üritab iPhone / iPadi mobiiltelefoni versiooni suunata.

Lõpus olevad valikud on spetsiifilised teatud XML-failidele. Enamikule RSS-failidele ja üldistele XML-failidele pole vaja neid sisse lülitada.

- (tühine) parser: (NSXMLParser *) parser parseErrorViga: (NSError *) parseError {

NSString * errorString = [NSString stringWithFormat: @ "Viga koodi% i", [parseError kood]];
NSLog (@ "Error parsing XML:% @", errorString);


errorParsing = YES;
}

See on lihtne viga kontrollimise suunamine, mis määrab binaarväärtuse, kui see esineb veas. Sõltuvalt sellest, mida teete, võib teil olla vaja midagi täpsemat. Kui teil on viga juhul vaja lihtsalt käivitada mingi kood pärast töötlemist, saab sellel ajal viga parameetri binaarse muutujaga välja kutsuda.

- (void) parser: (NSXMLParser *) parser didStartElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI qualifiedName: (NSString *) qName atribuudid: (NSDictionary *) attributeDict {
currentElement = [elementName copy];
ElementValue = [[NSMutableString alloc] init];
kui ([elementName isEqualToString: @ "item"]) {
kirje = [[NSMutableDictionary accter] init];

}

}

XML-parseri lihas on kolm funktsiooni, üks, mis käivitub üksikute elementide alguses, element, mis kestab elemendi parsimise keskele, ja element, mis töötab elemendi lõpus.

Selle näite puhul analüüsime faili, mis sarnaneb RSS-failidele, mis jagavad elemendid gruppidesse XML-faili rubriigis "üksused". Töötlemise alguses kontrollime uue elemendi nime "item" ja meie kirje sõnastikku, kui uut rühma on tuvastatud. Vastasel juhul initsialiseerime muutuja väärtuseks.

- (tühine) parser: (NSXMLParser *) parser findCharacters: (NSString *) string {
[ElementValue addString: string];
}

See on lihtne osa. Kui leiate tähemärke, lisame need lihtsalt muutuja "ElementValue" juurde.

- (tühine) parser: (NSXMLParser *) parser didEndElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI qualifiedName: (NSString *) qName {
kui ([elementName isEqualToString: @ "item"]) {
[artiklid addObject: [eksemplari kopeerimine]];
} else {
[element setObject: ElementValue forKey: elementName];
}

}

Kui oleme elemendi töötlemise lõpetanud, peame tegema ühe kahte asja: (1) kui lõpp-element on "element", oleme lõpetanud meie rühma, nii et lisame meie sõnastik meie massiiviks "artiklid "

Või (2) kui element ei ole "element", määrame meie sõnastikus väärtuse võtmega, mis vastab elemendi nimele. (See tähendab, et meil ei ole vaja XML-faili iga väljal eraldi muutujaid. Saame neid veidi rohkem dünaamiliselt töödelda.)

- (tühine) parserDidEndDocument: (NSXMLParser *) parser {

kui (errorParsing == NO)
{
NSLog (@ "XML processing done!");
} else {
NSLog (@ "Viga tekkis XML-i töötlemise ajal");
}

}

See on viimane funktsioon, mis on vajalik meie analüüsimiseks. See lihtsalt dokumendi lõpus. Saate panna koodi, mida soovite protsessi lõpetada siin või midagi erilist, mida võite vea korral teha.

Üks asi, mida paljud rakendused võiksid siin teha, on andmete ja / või XML-faili salvestamine seadmes olevale failile. Sel moel, kui kasutaja ei ühenda Internetti järgmisel korral, kui nad rakendust laadivad, saavad nad seda teavet siiski saada.

Loomulikult me ​​ei saa unustada kõige olulisemat osa: ütleb teie rakendus faili analüüsimiseks (andes sellele veebiaadressi selle leidmiseks!).

Protsessi alustamiseks peate lihtsalt lisama selle rea koodi sobivasse kohta, kuhu soovite XML-i töötlemist teha:

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