Hoe kinne XML-triemmen yn Xcode ferkine

Ien ienfâldige taak dat de eftergrûn is foar in soad apps is de mooglikheid om XML bestannen te beskriuwen. En, lokkich, makket Xcode it relatyf maklik om in XML-bestân yn 'e objekt-C te fersprieden.

In XML- bestân kin wat fan basale gegevens oer jo app hawwe oan in RSS-feed foar in webside. Se kinne ek in geweldige manier wêze om aktualisaasje yn jo app te fernijen, sadat de needsaak om in nij binêre oan Apple te stjoeren, ienfâldich om in nij item te jaan oan in list.

Hjirmei hoege wy XML-bestannen yn Xcode te ferwurkjen? It proses befettet stappen foar it ynitialisearjen fan de fariabelen dy't brûkt wurde, it begjinnen fan it XML-parserproses, it befeiligjen fan dat proses in triem, de start fan in yndividuele elemint, de tekens (wearde) yn it elemint, it ein fan in yndividuele elemint, en it ein fan it parsingproses.

Yn dit foarbyld sille wy in bestân fan it ynternet analysearje troch it troch in bepaalde webadres ( URL ) te passen.

Wy begjinne mei it bouwen fan 'e koptekst. Dit is in foarbyld fan in tige basic header file foar in Detail View Controller mei de minimale easken foar it analysearjen fan ús bestân:

@interface RootViewController: UITableViewController {
DetailViewController * detailViewController;

NSXMLParser * rssParser;
NSMutableArray * artikels;
NSMutableDictionary * item;
NSString * currentElement;
NSMutableString * ElementValue;
BOOL errorParsing;
}

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

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

De funksje parseXMLFileAtURL sil it proses foar ús begjinne. As it úteinset, sille de NSMutableArray "artikels" ús gegevens hâlde. De array sil makke wurde fan mienbere wurdboeken mei toetsen dy't ferbân hâlde mei de fjildnammen yn 'e XML-bestân.

No dat wy de fariabelen nedich hawwe, sille wy nei de moeting fan it proses yn 'e .m-bestân ferpleatse:

- (void) parserDidStartDocument: (NSXMLParser *) parser {
NSLog (@ "Triem fûn en parsing start");

}

Dizze funksje rint by it begjin fan it proses. It is net nedich om yn dizze funksje neat te setten, mar as jo in taak útfiere wolle as de triem begjint te ferpleatse, dit is wêr't jo jo koade sette.

- (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, lykas Gecko) Ferzje / 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: nul error: nil];


artikel = [[NSMutableArray alloc] init];
errorParsing = nee;

rssParser = [[NSXMLParser allinich] initWithData: xmlFile];
[rssParser setDelegate: self];

// Jo kinne miskien wol wat fan wêze op ôfhinklik fan it type XML-bestân dat jo analysearje
[rssParser setShouldProcessNamespaces: NO];
[rssParser setShouldReportNamespacePrefixes: NO];
[rssParser setShouldResolveExternalEntities: NO];

[rssParser parse];

}

Dizze funksje liedt de motor yn om in bestân op in bepaalde webadres (URL) te downloaden en it proses te begjinnen foar it analysearjen.

Wy fertelle de tsjinner op ôf dat wy in Safari rinne op Mac, krekt as gefolch dat de tsjinner besykje it iPhone / iPad nei in mobile ferzje te feroarjen.

De opsjes oan 'e ein binne spesifyk foar beskate XML-bestannen. De measte RSS-bestannen en generike XML-bestannen sille harren net nedich hawwe.

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

NSString * errorString = [NSString stringWithFormat: @ "Flaterkoade% i", [parseError code]];
NSLog (@ "Flater bywurkjen fan XML:% @", errorString);


errorParsing = YES;
}

Dit is in ienfâldige flater-kontrôle-routing dy't in binêre wearde ynstelle sil as it in flater befynt. Jo kinne hjir wat wat spesifyk nedich wêze, ôfhinklik fan wat jo dogge. As jo ​​gewoanwei koade nedich hawwe nei it ferwurkjen yn 't gefal fan flater, moat de errorParsing binary variable dan op dat stuit neamd wurde.

- (void) parser: (NSXMLParser *) parser didStartElement: (NSString *) elemintName namespaceURI: (NSString *) namespaceURI-kwalifisearreName: (NSString *) qName attributes: (NSDictionary *) attributeDict {
currentElement = [elemint kopiearje];
ElementValue = [[NSMutableString allinne] init];
as ([elemint isEqualToString: @ "item"]) {
item = [[NSMutableDictionary alloc] init];

}

}

It fleis fan 'e XML-parser befettet trije funksjes, ien dy't rint op it begjin fan in yndividuele elemint, ien dy't rint yn' e midden fan it eleminten parsen, en ien dy't rint oan 'e ein fan it elemint.

Foar dit foarbyld, sille wy in triem fergelykje mei RSS-bestannen dy't eleminten yn groepen ûnder de titel "items" binnen it XML-bestân brekke. By it begjin fan de ferwurking sille wy kontrolearje foar de elemintnamme "item" en it oanbelangje fan ús item wurdboek as in nije groep ûntdutsen wurdt. Oars, wy initialisearje ús fariabele foar de wearde.

- (void) parser: (NSXMLParser *) parser fûnCharacters: (NSString *) string {
[ElementValue appendString: string];
}

Dit is it maklike diel. As wy karakterisjes fine, ferpleegje wy se gewoan oan ús variable "ElementValue".

- (void) parser: (NSXMLParser *) parser didEndElement: (NSString *) elemintName namespaceURI: (NSString *) namespaceURI-kwalifisearreName: (NSString *) qName {
as ([elemint isEqualToString: @ "item"]) {
[artikels addObject: [item copy]];
} else {
[item setObject: ElementValue forKey: elementName];
}

}

As wy in elemint feroare hawwe, moatte wy ien fan beide dingen dwaan: (1) as it ein-elemint "item" is, hawwe wy ús groep ferteld, sadat wy ús wurdboek taheakje oan ús array fan "artikels ".

Of (2) as it elemint net "item" is, sille wy de wearde yn ús wurdboek befetsje mei in kaai dat oerienkomt mei de namme fan elemint. (Dit betsjut dat wy gjin unike fariabele foar elke fjild yn 'e XML-bestân hawwe. Wy kinne se in lyts dynamysk ferwurkje.)

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

as (errorParsing == NO)
{
NSLog (@ "XML-ferwurking dien!");
} else {
NSLog (@ "Flater barde ûnder XML-ferwurking");
}

}

Dit is de lêste funksje nedich foar ús parsing routine. It falt gewoan it dokumint. Jo sille elke koade sette dy't jo it proses hjirmei útskeakelje of wat spesjaal dat jo wolle as gefolch fan flater dwaan wolle.

Ien ding dat in protte apps hjir wolle wolle dat de data en / of XML-bestân bewarre wurde nei in bestân op it apparaat. Op dy manier, as de brûker net mei it ynternet ferbûn is, de folgjende kear dat se de app lade, kinne se dizze ynformaasje noch krije.

Fansels kinne wy ​​it wichtichste diel net ferjitte: jo applikaasje fertelle om it bestân te fersprieden (en it jaan fan in webadres om it te finen!).

Om it proses te begjinnen, moatte jo gewoan deze rigel taheakje oan it passende plak wêr't jo de XML-ferwurking dwaan wolle:

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