Hoe XML-bestanden te ontleden in Xcode

Hoewel een ingebouwde XML parser voegt echte waarde toe aan een nieuwe desktop- of mobiele applicatie, omdat het coderen van die functionaliteit doorgaans veel ontwikkeltijd en bètatests vereist. Het Xcode-programma van Apple bevat een XML-parser die het grootste deel van dit handmatige werk omzeilt.

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 de noodzaak om een ​​nieuw binair bestand naar Apple te sturen, wordt omzeild om simpelweg een nieuw item aan een lijst toe te voegen.

Het Xcode-proces

Het ingebouwde Xcode-proces bevat stappen voor het initialiseren van de te gebruiken variabelen, het starten van het XML-parserproces, het invoeren van een bestand in dat proces, individuele elementen en de karakters (waarde) binnen die elementen beoordelen, het einde van een individueel element herkennen en het ontleden beëindigen werkwijze.

instagram viewer

Gebruik de XML-parser

Om de details te illustreren, zullen we een voorbeeldbestand van internet ontleden door het een bepaald webadres door te geven (URL).

Begin met het maken van het headerbestand. Dit is een voorbeeld van een zeer eenvoudig headerbestand voor een Detail View Controller met de minimale vereisten voor het ontleden van ons bestand:

@interface RootViewController: UITableViewController {
DetailViewController *detailViewController;
NSXMLParser *rssParser;
NSMutableArray *artikelen;
NSMutableDictionary *item;
NSString *currentElement;
NSMutableString *ElementValue;
BOOL-fout Parsing;
}
@property (niet-atomisch, behouden) IBOutlet DetailViewController *detailViewController;
- (ongeldig) parseXMLFileAtURL:(NSString *)URL;


De functie parseXMLFileAtURL start het proces. Als het klaar is, bevatten de NSMutableArray "artikelen" de gegevens. De array bestaat uit veranderlijke woordenboeken met sleutels die verband houden met de veldnamen in het XML-bestand.

Initialiseer vervolgens het proces:

- (void) parserDidStartDocument:(NSXMLParser *)parser{
NSLog(@"Bestand gevonden en parseren gestart");
}

Deze functie draait aan het begin van het proces. Het is niet nodig om iets in deze functie in te voeren, maar als u een taak wilt uitvoeren wanneer het bestand begint te worden geparseerd, moet u hier uw code plaatsen.

Instrueer het programma om iets te downloaden

Instrueer vervolgens het programma om iets te downloaden:

- (ongeldig) parseXMLFileAtURL:(NSString *)URL
{
NSString *agentString = @"Mozilla/5.0 (Macintosh; jij; Intel Mac OS X 10_5_6; nl-nl) AppleWebKit/525.27.1 (KHTML, zoals Gecko) Versie/3.2.1 Safari/525.27.1";
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:
[NSURL URLWithString: URL]];
[setValue aanvragen: agentString forHTTPHeaderField:@"User-Agent"];
xmlFile = [ NSURLConnection sendSynchronousRequest: request returnResponse: nul fout: nul];
artikelen = [[NSMutableArray alloc] init];
errorParsing=NEE;
rssParser = [[NSXMLParser alloc] initWithData: xmlFile];
[rssParser setDelegate: zelf];
// Mogelijk moet u enkele hiervan inschakelen, afhankelijk van het type XML-bestand dat u aan het parseren bent
[rssParser setShouldProcessNamespaces: NO];
[rssParser setShouldReportNamespacePrefixes: NO];
[rssParser setShouldResolveExternalEntities: NO];
[rssParser ontleden];
}


Deze functie instrueert de engine 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 zijn die op Mac draait, 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 generieke XML-bestanden hoeft u ze niet aan te zetten.

Fout - Controleer het resultaat

Voer enkele basisfoutcontroles uit op het resultaat:

- (void) parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError {
NSString *errorString = [NSString stringWithFormat:@"Foutcode %i", [parseErrorcode]];
NSLog(@"Fout bij het parseren van XML: %@", errorString);
errorParsing=JA;
}Deze foutcontroleroutering stelt een binaire waarde in als er een fout optreedt. Mogelijk hebt u hier iets specifiekers nodig, afhankelijk van wat u doet. Als u gewoon wat code moet uitvoeren na verwerking in het geval van een fout, is de


Deze foutcontroleroutine stelt een binaire waarde in als er een fout wordt aangetroffen. Mogelijk hebt u hier iets specifiekers nodig, afhankelijk van wat u doet. Als u gewoon wat code moet uitvoeren na verwerking in het geval van een fout, kan op dat moment de binaire variabele voor het parseren van fouten worden aangeroepen.

Analyseer de opgehaalde inhoud

Vervolgens splitst het programma de opgehaalde inhoud op en analyseert deze:

- (void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI gekwalificeerdeName:(NSString *)qName attributen:(NSDictionary *)attributeDict{
currentElement = [kopie elementnaam];
ElementValue = [[NSMutableString alloc] init];
if ([elementName isEqualToString:@"item"]) {
item = [[NSMutableDictionary alloc] init];
}
}


Het vlees van de XML-parser bevat drie functies, een die aan het begin van een individu wordt uitgevoerd element, een die tijdens het parseren van het element wordt uitgevoerd, en een die aan het einde van de element.

Voor dit voorbeeld zullen we een bestand ontleden dat lijkt op RSS-bestanden die elementen opsplitsen in groepen onder de kop van artikelen binnen het XML-bestand. Aan het begin van de verwerking controleren we op 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 gevondenkarakters:(NSString *)string{
[ElementValue appendString: string];
}


Wanneer we tekens vinden, voegen we ze gewoon toe aan onze variabele ElementWaarde:

- (void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI gekwalificeerdName:(NSString *)qName{
if ([elementName isEqualToString:@"item"]) {
[artikelen addObject:[item kopie]];
} anders {
[item setObject: ElementValue forKey: elementName];
}
}

Wat gebeurt er als het parseren is voltooid

Wanneer het programma klaar is met het verwerken van een element, moet het een van de volgende twee dingen doen:

  • Als het eindelement is item, we hebben onze groep beëindigd, dus we zullen ons woordenboek aan onze reeks artikelen toevoegen.
  • Als het element niet is item, zullen we de waarde in ons woordenboek instellen met een sleutel die overeenkomt met de naam van het element. (Dit betekent dat we geen individuele variabele nodig hebben voor elk veld in het XML-bestand. We kunnen ze iets dynamischer verwerken.)

Dit is de laatste functie die nodig is voor onze parseerroutine; het beëindigt het document. Plaats hier een definitieve code of specificeer een foutcorrigerende subroutine:

- (void) parserDidEndDocument:(NSXMLParser *)parser {
if (fout Parsing == NEE)
{
NSLog(@"XML-verwerking klaar!");
} anders {
NSLog(@"Fout opgetreden tijdens XML-verwerking");
}
}

Sla de data op

Een ding dat veel apps hier misschien willen doen, is de gegevens of het XML-bestand opslaan in een bestand op het apparaat. Op die manier kan het apparaat, als het apparaat de volgende keer dat de app wordt geladen niet met internet is verbonden, toch bij deze informatie komen.

Natuurlijk mogen we het belangrijkste onderdeel niet vergeten: uw toepassing vertellen om het bestand te ontleden (en het een webadres geven om het te vinden!). Om het proces te starten, voegt u deze regel code toe aan de juiste plaats waar u de XML-verwerking wilt doen:

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