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"];