Sut i Parse Ffeiliau XML mewn Xcode

Un tasg syml, sef yr asgwrn cefn i lawer o apps, yw'r gallu i barcio ffeiliau XML. Ac, yn ffodus, mae Xcode yn ei gwneud yn gymharol hawdd i brasio ffeil XML yn Amcan-C.

Gall ffeil XML gynnwys unrhyw beth o ddata sylfaenol am eich app i fwyd RSS ar gyfer gwefan. Gallant hefyd fod yn ffordd wych o ddiweddaru gwybodaeth o fewn eich app o bell, gan osgoi'r angen i gyflwyno binen newydd i Apple yn syml i ychwanegu eitem newydd at restr.

Felly, sut rydym ni'n prosesu ffeiliau XML yn Xcode? Mae'r broses yn cynnwys camau ar gyfer cychwyn y newidynnau i'w defnyddio, gan ddechrau'r broses parser XML, gan fwydo'r broses honno ffeil, cychwyn elfen unigol, y cymeriadau (gwerth) o fewn yr elfen, diwedd elfen unigol, a diwedd y broses ddadansoddi.

Yn yr enghraifft hon, byddwn yn dadansoddi ffeil o'r Rhyngrwyd trwy roi cyfeiriad gwe penodol ( URL ) iddo.

Byddwn yn dechrau wrth adeiladu'r ffeil pennawd. Dyma enghraifft o ffeil pennawd sylfaenol iawn ar gyfer Rheolwr Gweld Manylion gyda'r gofynion sylfaenol ar gyfer parsio ein ffeil:

@interface RootViewController: UITableViewController {
DetailViewController * manylionViewController;

NSXMLParser * rssParser;
Erthyglau NSMutableArray *;
NSMutableDictionary * eitem;
NSString * currentElement;
NSMutableString * ElementValue;
Gwall BOOLParsing;
}

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

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

Bydd y swyddogaeth parseXMLFileAtURL yn dechrau'r broses i ni. Pan fydd yn gorffen, bydd yr erthyglau "NSMutableArray" yn dal ein data. Bydd y cyfres yn cynnwys geiriaduron mutable gydag allweddi sy'n gysylltiedig â'r enwau maes yn y ffeil XML.

Nawr ein bod wedi sefydlu'r newidynnau sydd eu hangen, byddwn yn symud ymlaen i gyfarfod y broses yn y ffeil .m:

- (void) parserDidStartDocument: (NSXMLParser *) parser {
NSLog (@ "Ffeil wedi ei ddarganfod a parsing dechrau");

}

Mae'r swyddogaeth hon yn rhedeg ar ddechrau'r broses. Nid oes angen rhoi unrhyw beth yn y swyddogaeth hon, ond os ydych chi am wneud tasg pan fydd y ffeil yn dechrau cael ei ddadansoddi, dyma lle y byddech chi'n gosod eich cod.

- (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, fel Gecko) Fersiwn / 3.2.1 Safari / 525.27.1";
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:
[NSURL URLWithString: URL]];
[cais setValue: agentString forHTTPHeaderField: @ "Defnyddiwr-Asiant"];
xmlFile = [NSURLConnection sendSynchronousRequest: gofyn am ddychwelydResiwn: dim gwall: dim];


erthyglau = [[NSMutableArray alloc] init];
errorParsing = NAW;

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

// Efallai y bydd angen i chi droi rhai o'r rhain yn dibynnu ar y math o ffeil XML rydych chi'n ei ddadansoddi
[rssParser setShouldProcessNamespaces: NA];
[rssParser setShouldReportNamespacePrefixes: NA];
[rssParser setShouldResolveExternalEntities: NA];

[parhad rssParser];

}

Mae'r swyddogaeth hon yn cyfarwyddo'r peiriant i lawrlwytho ffeil mewn cyfeiriad gwe penodol (URL) a chychwyn y broses ar gyfer ei ddadansoddi.

Rydyn ni'n dweud wrth y gweinydd anghysbell ein bod yn Safari sy'n rhedeg ar Mac rhag ofn bod y gweinydd yn ceisio ailgyfeirio'r iPhone / iPad i fersiwn symudol.

Mae'r opsiynau ar y diwedd yn benodol i rai ffeiliau XML. Ni fydd angen i'r rhan fwyaf o ffeiliau RSS a ffeiliau XML generig eu troi ymlaen.

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

NSString * errorString = [NSString stringWithFormat: @ "Cod Gwall% i", [cod parseError]];
NSLog (@ "Gwall wrth ddadansoddi XML:% @", errorString);


errorParsing = YDY;
}

Mae hwn yn drefnu gwirio gwall syml a fydd yn gosod gwerth deuaidd os yw'n dod ar draws gwall. Efallai y bydd angen rhywbeth mwy penodol yma arnoch yn dibynnu ar yr hyn rydych chi'n ei wneud. Os oes angen i chi redeg rhywfaint o god ar ôl ei brosesu yn achos gwall, gellir galw'r newidiad binwm ErrorParsing ar yr adeg honno.

parser ((void): (parser NSXMLParser *) didStartElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI cymhwysoName: (NSString *) q PriodweddauName: (NSDictionary * attribute attributeDict {
currentElement = [copi elfenName];
ElementValue = [[NSMutableString alloc] init];
os ([elementName isEqualToString: @ "item"]) {
eitem = [[NSMutableDictionary alloc] init];

}

}

Mae cig y parser XML yn cynnwys tair swyddogaeth, un sy'n rhedeg ar ddechrau elfen unigol, un sy'n rhedeg yn ystod canol y parsing yr elfen, ac un sy'n rhedeg ar ddiwedd yr elfen.

Ar gyfer yr enghraifft hon, byddwn yn dadansoddi ffeil tebyg i ffeiliau RSS sy'n torri'r elfennau i mewn i grwpiau dan y pennawd "eitemau" o fewn y ffeil XML. Ar ddechrau'r prosesu, rydym yn gwirio am yr enw elfen "eitem" a dyrannu ein geiriadur eitem pan ddarganfyddir grŵp newydd. Fel arall, rydym yn cychwyn ein newid yn y gwerth.

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

Dyma'r rhan hawdd. Pan fyddwn ni'n dod o hyd i gymeriadau, rydym yn eu hychwanegu at ein "ElementValue" amrywiol.

parser ((void): (parser NSXMLParser *) didEndElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI cymhwysoName: (NSString *) qName {
os ([elementName isEqualToString: @ "item"]) {
[article addObject: [eitem copi]];
} arall {
[item setObject: ElementValue forKey: elementName];
}

}

Pan fyddwn wedi gorffen prosesu elfen, mae angen i ni wneud un o ddau beth: (1) os yw'r elfen derfynol yn "eitem", rydym wedi gorffen ein grŵp, felly byddwn ni'n ychwanegu ein geiriadur at ein cyfres o "erthyglau ".

Neu (2) os nad yw'r elfen yn "eitem", byddwn yn gosod y gwerth yn ein geiriadur gydag allwedd sy'n cyfateb i enw'r elfen. (Mae hyn yn golygu nad oes angen newidyn unigol arnom ar gyfer pob maes yn y ffeil XML. Gallwn eu prosesu ychydig yn fwy dynamegol.)

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

os (errorParsing == NAC)
{
NSLog (@ "prosesu XML wedi'i wneud!");
} arall {
NSLog (@ "Gwall wedi digwydd yn ystod prosesu XML");
}

}

Dyma'r swyddogaeth olaf sydd ei angen ar gyfer ein trefn barcio. Mae'n gorffen y ddogfen yn unig. Byddwch yn rhoi unrhyw god rydych chi am orffen y broses yma neu unrhyw beth arbennig y gallech chi ei wneud os bydd gwall.

Un peth o bethau y gallech chi eu gwneud yma yw achub y ffeil ddata a / neu XML i ffeil ar y ddyfais. Felly, os nad yw'r defnyddiwr wedi'i gysylltu â'r Rhyngrwyd y tro nesaf y byddant yn llwytho'r app, gallant barhau i gael yr wybodaeth hon.

Wrth gwrs, ni allwn anghofio y rhan bwysicaf: dweud wrth eich cais i bario'r ffeil (a rhoi cyfeiriad gwe i ddod i'w gael ar!).

I ddechrau'r broses, dim ond rhaid ychwanegu'r llinell hon o god i'r man priodol lle rydych chi am wneud y prosesu XML:

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