Hoe om XML-lêers te ontleed in Xcode

Een eenvoudige taak wat die ruggraat vir baie programme is, is die vermoë om XML-lêers te ontleed. En gelukkig maak Xcode dit relatief maklik om 'n XML-lêer in Objective-C te ontleed.

'N XML- lêer kan enigiets bevat van basiese data oor jou program na 'n RSS-voer vir 'n webwerf. Hulle kan ook 'n goeie manier wees om inligting binne jou program op te dateer, sodat die behoefte om 'n nuwe binêre na Apple in te dien, blootgestel word om 'n nuwe item by 'n lys by te voeg.

So, hoe verwerk ons ​​XML-lêers in Xcode? Die proses bevat stappe vir die initialisering van die veranderlikes wat gebruik moet word, die begin van die XML-parser-proses, die invoer van 'n lêer, die begin van 'n individuele element, die karakters (waarde) binne die element, die einde van 'n individuele element, en die einde van die ontledingsproses.

In hierdie voorbeeld sal ons 'n lêer uit die internet analiseer deur dit 'n bepaalde webadres ( URL ) te gee.

Ons sal begin met die opbou van die header-lêer. Dit is 'n voorbeeld van 'n baie basiese header-lêer vir 'n Detail View Controller met die minimum vereistes vir die ontleding van ons lêer:

@interface RootViewController: UITableViewController {
DetailViewController * detailViewController;

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

@ Property (nonatomic, behou) IBOutlet DetailViewController * detailViewController;

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

Die parseXMLFileAtURL funksie sal die proses vir ons begin. Wanneer dit klaar is, sal die NSMutableArray "artikels" ons data hou. Die skikking sal bestaan ​​uit veranderlike woordeboeke met sleutels wat verband hou met die veldname in die XML-lêer.

Noudat ons die veranderlikes benodig het, sal ons voortgaan na die ontmoeting van die proses in die .m-lêer:

- (void) parserDidStartDocument: (NSXMLParser *) parser {
NSLog (@ "Lêer gevind en parsering begin");

}

Hierdie funksie loop aan die begin van die proses. Daar hoef nie iets in hierdie funksie te plaas nie, maar as jy 'n taak wil uitvoer wanneer die lêer begin ontleed word, is dit waar jy jou kode sal plaas.

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

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


artikels = [[NSMutableArray alloc] init];
errorParsing = GEEN;

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

// U moet moontlik van hierdie aanskakel, afhangende van die tipe XML-lêer wat u parseer
[rssParser stelShouldProcessNamespaces: NEE];
[rssParser setShouldReportNamespacePrefixes: NEE];
[rssParser setShouldResolveExternalEntities: NEE];

[rssParser parse];

}

Hierdie funksie gee instruksies aan die enjin om 'n lêer by 'n spesifieke webadres (URL) af te laai en die proses te begin om dit te ontleed.

Ons vertel die eksterne bediener dat ons 'n Safari op Mac is, net as die bediener die iPhone / iPad probeer omskakel na 'n mobiele weergawe.

Die opsies aan die einde is spesifiek vir sekere XML-lêers. Die meeste RSS-lêers en generiese XML-lêers sal nie nodig hê dat hulle aangeskakel word nie.

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

NSString * errorString = [NSString stringWithFormat: @ "Foutkode% i", [parseError code]];
NSLog (@ "Fout ontleed XML:% @", errorString);


errorParsing = Ja;
}

Dit is 'n eenvoudige fout-kontrole routing wat 'n binêre waarde sal stel as dit 'n fout ervaar. U benodig dalk iets meer spesifiek hier, afhangende van wat u doen. As jy net 'n kode moet hardloop na die verwerking in die geval van 'n fout, kan die foutParsing binêre veranderlike op daardie tydstip geroep word.

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

}

}

Die vleis van die XML-parser bevat drie funksies, een wat aan die begin van 'n individuele element loop, een wat loop gedurende die middel van die element en een wat aan die einde van die element loop.

Vir hierdie voorbeeld sal ons 'n lêer analiseer wat soortgelyk is aan RSS-lêers wat elemente in groepe onder die opskrif "items" in die XML-lêer breek. By die begin van die verwerking kyk ons ​​na die element naam "item" en ken ons itemwoordeboek toe wanneer 'n nuwe groep bespeur word. Andersins begin ons ons veranderlike vir die waarde.

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

Dit is die maklike deel. Wanneer ons karakters vind, voeg ons hulle eenvoudig by ons veranderlike "ElementValue".

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

}

Wanneer ons klaar is met die verwerking van 'n element, moet ons een van twee dinge doen: (1) as die eindelement 'item' is, het ons ons groep voltooi, sodat ons ons woordeboek by ons verskeidenheid artikels sal voeg ".

Of (2) as die element nie 'item' is nie, sal ons die waarde in ons woordeboek stel met 'n sleutel wat ooreenstem met die element se naam. (Dit beteken dat ons nie 'n individuele veranderlike vir elke veld in die XML-lêer nodig het nie. Ons kan hulle 'n bietjie meer dinamies verwerk.)

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

as (errorParsing == NEE)
{
NSLog (@ "XML-verwerking gedoen!");
} anders {
NSLog (@ "Fout het voorgekom tydens XML-verwerking");
}

}

Dit is die laaste funksie wat nodig is vir ons parseerroetine. Dit eindig bloot die dokument. Jy sal enige kode wat jy wil hê om die proses hier af te handel of iets spesiaals wat jy dalk wil doen in die geval van 'n fout.

Een ding wat baie programme dalk hier wil doen, is om die data en / of XML-lêer na 'n lêer op die toestel te stoor. So, as die gebruiker nie aan die internet gekoppel is nie, kan hulle die volgende keer by die inligting laai wanneer hulle die program laai.

Natuurlik kan ons nie die belangrikste deel vergeet nie: vertel jou aansoek om die lêer te ontleed (en gee dit 'n webadres om dit by te vind!).

Om die proses te begin, moet jy hierdie lyn kode byvoeg tot die toepaslike plek waar jy die XML-verwerking wil doen:

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