Een eenvoudige taak die de ruggengraat vormt van veel apps, is de mogelijkheid om XML-bestanden te ontleden. En gelukkig maakt Xcode het relatief eenvoudig om een XML-bestand te ontleden in Objective-C.
Een XML-bestand kan alles bevatten, van basisgegevens over uw app tot een RSS-feed voor een website. Ze kunnen ook een geweldige manier zijn om informatie in uw app op afstand bij te werken, waardoor u de noodzaak om een nieuw binair bestand naar Apple te verzenden eenvoudig overslaat om een nieuw item aan een lijst toe te voegen.
Dus hoe verwerken we XML-bestanden in Xcode? Het proces bevat stappen voor het initialiseren van de te gebruiken variabelen, het starten van het XML-parserproces, het toevoeren van dat proces aan een bestand, het begin van een afzonderlijk element, de tekens (waarde) binnen het element, het einde van een afzonderlijk element en het einde van het ontleedproces.
In dit voorbeeld zullen we een bestand van internet ontleden door het een bepaald webadres (URL) door te geven.
We beginnen met het uitbouwen van het header-bestand. Dit is een voorbeeld van een zeer elementair header-bestand voor een Detail View Controller met de minimale vereisten voor het parseren van ons bestand:
@interface RootViewController: UITableViewController {DetailViewController * detailViewController;NSXMLParser * rssParser;NSMutableArray * artikelen;NSMutableDictionary * item;NSString * currentElement;NSMutableString * ElementValue;BOOL errorParsing;}@property (nonatomic, retain) IBOutlet DetailViewController * detailViewController;- (void) parseXMLFileAtURL: (NSString *) URL;De parseXMLFileAtURL-functie start het proces voor ons. Als het klaar is, bevatten de NSMutableArray "-artikelen" onze gegevens. De array bestaat uit verwisselbare woordenboeken met sleutels die zijn gerelateerd aan de veldnamen in het XML-bestand. Nu we de benodigde variabelen hebben ingesteld, gaan we verder met de bijeenkomst van het proces in het .m-bestand:
- (void) parserDidStartDocument: (NSXMLParser *) parser {NSLog (@ "Bestand gevonden en ontleed gestart");} Deze functie wordt aan het begin van het proces uitgevoerd. Het is niet nodig om iets in deze functie te plaatsen, maar als u een taak wilt uitvoeren wanneer het bestand begint te worden geparseerd, dan is dit waar u uw code zou plaatsen.
- (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, like Gecko) Versie / 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;artikelen = NSMutableArray alloc init;errorParsing = NO;rssParser = NSXMLParser alloc initWithData: xmlFile;rssParser setDelegate: self;// Mogelijk moet u een aantal hiervan inschakelen, afhankelijk van het type XML-bestand dat u parseertrssParser setShouldProcessNamespaces: NO;rssParser setShouldReportNamespacePrefixes: NO;rssParser setShouldResolveExternalEntities: NO;rssParser parseren;} Deze functie geeft de motor de opdracht om een bestand op een bepaald webadres (URL) te downloaden en het proces te starten om het te ontleden. We vertellen de externe server dat we een Safari op Mac zijn, voor het geval de server probeert de iPhone / iPad om te leiden naar een mobiele versie.De opties aan het einde zijn specifiek voor bepaalde XML-bestanden. Voor de meeste RSS-bestanden en algemene XML-bestanden hoeven deze niet te worden ingeschakeld.
- (void) parser: (NSXMLParser *) parser parseErrorOccurred: (NSError *) parseError {NSString * errorString = NSString stringWithFormat: @ "Foutcode% i", parseError-code;NSLog (@ "Fout bij parseren van XML:% @", errorString);errorParsing = YES;}Dit is een eenvoudige routering voor foutcontrole die een binaire waarde instelt als er een fout optreedt. Misschien heb je hier iets specifieks nodig, afhankelijk van wat je aan het doen bent. Als u na het verwerken van de foutcode eenvoudigweg enige code moet uitvoeren, kan de binaire variabele errorParsing op dat moment worden aangeroepen.
- (void) parser: (NSXMLParser *) parser didStartElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI qualifiedName: (NSString *) qName attributes: (NSDictionary *) attributeDict {currentElement = elementName kopie;ElementValue = NSMutableString alloc init;if (elementName isEqualToString: @ "item") {item = NSMutableDictionary alloc init;}} Het vlees van de XML-parser bevat drie functies, een die wordt uitgevoerd aan het begin van een afzonderlijk element, een element dat wordt uitgevoerd tijdens het parseren van het element en een element dat aan het einde van het element wordt uitgevoerd. Voor dit voorbeeld ontleden we een bestand dat lijkt op RSS-bestanden die elementen onderverdelen in groepen onder de kop "items" in het XML-bestand. Aan het begin van de verwerking controleren we de elementnaam "item" en wijzen we ons itemwoordenboek toe wanneer een nieuwe groep wordt gedetecteerd. Anders initialiseren we onze variabele voor de waarde.
- (void) parser: (NSXMLParser *) parser foundCharacters: (NSString *) string {ElementValue appendString: string;} Dit is het makkelijke gedeelte. Wanneer we tekens vinden, voegen we ze gewoon toe aan onze variabele "ElementValue".
- (void) parser: (NSXMLParser *) parser didEndElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI qualifiedName: (NSString *) qName {if (elementName isEqualToString: @ "item") {artikelen addObject: item kopiëren;} else {item setObject: ElementValue forKey: elementName;}} Wanneer we een element hebben verwerkt, moeten we een van de twee dingen doen: (1) als het eindelement 'item' is, hebben we onze groep beëindigd, dus we zullen ons woordenboek toevoegen aan onze reeks 'artikelen' ". Of (2) als het element geen 'item' is, stellen we de waarde in ons woordenboek in met een sleutel die overeenkomt met de naam van het element. (Dit betekent dat we geen individuele variabele nodig hebben voor elk veld binnen het XML-bestand, maar we kunnen ze iets dynamischer verwerken.)
- (void) parserDidEndDocument: (NSXMLParser *) parser {if (errorParsing == NO){NSLog (@ "XML-verwerking voltooid!");} else {NSLog (@ "Fout opgetreden tijdens XML-verwerking");}} Dit is de laatste functie die nodig is voor onze ontleedroutine. Het beëindigt eenvoudig het document. Je plaatst hier elke code die je wilt voltooien, of iets speciaals dat je zou willen doen in geval van een fout. Een ding dat veel apps hier willen doen is om de gegevens en / of het XML-bestand op te slaan in een bestand op het apparaat. Op die manier kunnen gebruikers, als ze de volgende keer dat ze de app laden, geen verbinding met internet hebben, toch bij deze informatie komen. Natuurlijk kunnen we het belangrijkste deel niet vergeten: uw applicatie vertellen om het bestand te ontleden (en het een webadres geven om het te vinden op!). Om het proces te starten, hoeft u deze regel alleen toe te voegen aan de juiste plaats waar u de XML-verwerking wilt doen:
self parseXMLFileAtURL: @ "http://www.webaddress.com/file.xml";