Wéi virgesinn XML-Dateien an Xcode ze benotzen

Eng einfache Aufgab, déi de Réckgrong fir vill Apps ass d'Fähigkeit ze verhalen XML Dateien. An, glécklech, Xcode mécht et relativ einfach einfach eng XML-Datei an Objective-C ze analyséieren.

Eng XML- Fichier kann alles mat grénge Donnéeën iwwer Är App zu engem RSS-Feed fir eng Websäit enthalen. Si kënnen och eng gutt Manéier fir Informatioun an Ärem App aus der Vergaangenheet ze aktualiséieren, doduerch d'Notwendegkeet, e neie Binär op Apple ze liesen, einfach en neien Element an eng Lëscht ze addéieren.

Wéi funktionnéiere mir XML-Dateie an Xcode? De Prozess enthält Schrëtt fir d'Initialiséierung vun den Variablen déi benotzt gëtt fir unzefänken, de XML-Parserprozess ze starten, d'Fuerderung e Fichier, den Start vun engem individuellen Element, d'Zeechen (Wäert) am Element, Enn vun engem individuellen Element, an dem Enn vum Parsingprozess.

An dësem Beispill wäerte mir e Fichier aus dem Internet analyséieren andeems se e speziell Websäit adresséieren ( URL ).

Mir starten mat der Ausféierung vun der Headerfile. Dëst ass e Beispill vun enger ganz einfacher Header-Datei fir e Detail View Controller mat den Mindestanforderungen fir d'Parsing vun eiser Datei:

@interface RootViewController: UITableViewController {
DetailViewController * DetailViewController;

NSXMLParser * rssParser;
NSMutableArray * Artikelen;
NSMutableDictionary * Element;
NSString * aktuellElement;
NSMutableString * ElementValue;
BOOL errorParsing;
}}

@property (nonatomic, behalen) IBOutlet DetailViewController * DetailViewController;

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

D'Funktioun parseXMLFileAtURL fiert de Prozess fir eis un. Wann et fäerdeg ass, wäert d'NSMutableArray "Artikelen" eis Daten halen. D'Array ass aus méiglechen Dictionnairen mat Tasteen mat den Feldennamen an der XML-Datei gemaach.

Elo, datt mir d'Variabel gebraucht hunn, ginn mir op d'Besoine vum Prozess an der .m Datei:

- (void) parserDidStartDocument: (NSXMLParser *) Parser {
NSLog (@ "Fichier fonnt an analyséiert ugefaangen");

}}

Dës Funktioun läst am Ufank vum Prozess. Dir musst näischt an dëser Funktioun setzen, awer wann Dir eng Task erlediget, wann d'Datei ofgeschaaft gëtt, da gitt Dir Äre Code.

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

NSString * AgentString = @ "Mozilla / 5.0 (Macintosh; U, Intel Mac OS X 10_5_6; en-us) AppleWebKit / 525.27.1 (KHTML, wéi Gecko) Version / 3.2.1 Safari / 525.27.1";
NSMutableURLRequest * Ufro = [NSMutableURLRequest requestWithURL:
[NSURL URLWithString: URL]];
[bitt SetValue: agentString forHTTPHeaderField: @ "User-Agent"];
xmlFile = [NSURLConnection SendSynchronousRequest: Ufro zréckruffenResponse: Nullfehler: nil];


Artikelen = [[NSMutableArray alued] init];
errorParsing = NEE;

rssParser = [[NSXMLParser alued] initWithData: xmlFile];
[rssParser setDelegate: Selbst];

// Dir musst e puer dovun ofhänken wéi jee no der Art XML-Datei déi Dir analyséiert
[rssParser setShouldProcessNamespaces: NEE];
[rssParser setShouldReportNamespacePrefixes: NEE];
[rssParser setShouldResolveExternalEntities: NO];

[rssParser parse];

}}

Dës Funktioun weist de Motor fir e Fichier op enger bestëmmter Websäit (URL) ze liesen an de Prozess ze preparéieren fir se ze analyséieren.

Mir soen de Remote Server datt mir eng Safari lafen op Mac nëmme wann de Server probéiert gëtt de iPhone / iPad op eng mobil Versioun ze versuergen.

Déi Optiounen um Schluss sinn spezifesch XML Files. Déi meescht RSS - Dateien an generesch XML - Fichier brauchen se net opgesat.

- (void) parser: (NSXMLParser *) Parser parseErrorOccurred: (NSError *) parseError {

NSString * errorString = [NSString stringWithFormat: @ "Feelercode% i", [parseError code]];
NSLog (@ "Feeler Parsing XML:% @", errorString);


errorParsing = jo;
}}

Dëst ass e einfache Fehlertest Routing, deen e binäre Wäert setzt wann et e Feeler trëfft. Dir musst eventuell eppes méi spezifësch sinn hier wéi jee wat Dir maacht. Wann Dir just nach e Code nach der Veraarbechtung am Fall vu Feeler gemaach gëtt, kann d'Fichier ofgelenkt errorParsing zu där Zäit genannt ginn.

- (void) parser: (NSXMLParser *) parser didStartElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI qualifizéiertName: (NSString *) qName Attributiounen: (NSDictionary *) attributeDict {
aktuellElement = [ElementName Kopie];
ElementValue = [[NSMutableString allgemeng] init];
Wann ([ElementName isEqualToString: @ "item"]) {
Element = = [[NSMutableDictionary alloc] init];

}}

}}

D'Fleesch vum XML-Parser enthält dräi Fonktioune, déi am Ufank vun engem individuellen Element läis ass, deen an der Mëtt vun der Analyse vum Element läuft, an deen am Ende vum Element féiert.

Fir dëst Beispill wäerte mir e Fichier wéi RSS-Säiten analyséiere fir Elementer an Gruppen ënnert der Rubrik "Elemente" an der XML-Datei ze bremsen. Am Start vun der Veraarbechtung kontrolléieren mir de Element "Element" an d'Ofwécklung vun eisem Elementbuch, wann eng nei Grupp festgestallt gëtt. Sinn éier mir eis Variabel fir den Wert initialiséieren.

- (void) parser: (NSXMLParser *) Parser fonntCharacters: (NSString *) String {
[ElementValue appendString: Zeechen];
}}

Dëst ass den einfachen Deel. Wann mir Zeechen fannen, addéiere mer se einfach op eis variabel "ElementValue".

- (void) parser: (NSXMLParser *) parser didEndElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI qualifizéiertName: (NSString *) qName {
Wann ([ElementName isEqualToString: @ "item"]) {
[Artikel AddObject: [Exemplar]];
} else {
[item setObject: ElementValue firKey: elementName];
}}

}}

Wann mer d'Veraarbechtung vun engem Element ofgeschloss hunn, brauche mir eng vun zwee Saachen ze maachen: (1) Wann d'Ennement "item" ass, hunn mir eis Grupp fäerdeg gemaach, fir datt mir eise Wierder zu eisem Array vun "Artikelen ".

Oder (2) Wann d'Element net "Element" ass, setze mir de Wäert an eisem Wierder mat engem Schlëssel mat dem Numm vum Element. (Dëst heescht datt mir eng individuell Variabel fir all Feld an der XML-Datei net brauchen. Mir kënnen se e bësse méi dynamesch veränneren.)

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

Wann (errorParsing == NO)
{
NSLog (@ "XML Veraarbechtung fäerdeg!");
} else {
NSLog (@ "Error occurred during XML-Prozess");
}}

}}

Dëst ass déi lescht Funktioun fir eis Parsingroutin. Et schléit einfach den Dokument. Dir kënnt all Code deen Dir wëllt de Prozess ofgeschloss oder eppes wat Dir wëllt an engem Fall vu Feeler maachen.

E puer Saachen, déi vill Apps wëllt hei eroflueden, ass fir d'Daten an / oder XML-Datei op eng Datei op deem Apparat ze speichern. Dofir, wann de Benotzer net mat dem Internet verbonne sinn, ginn d'nächst Kéier d'App gelueden, kënne si ëmmer nach op dës Informatioun kréien.

Natierlech kënne mir de gréissten Deel net vergiessen: Dir sot Är Applikatioun fir d'Datei ze analyséieren (a gitt et eng Websäit fir ze fannen!).

Fir de Prozess ze starten, musst Dir einfach dës Linn vu Code un d'Uersetzung erofhuelen an där d'XML-Veraarbechtung wëllt maachen:

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