Kiel Parse XML-dosieroj en Xcode

Unu simpla tasko, kiu estas la dorso al multaj apps, estas la ebleco por analizi XML-dosierojn. Kaj, feliĉe, Xcode faras ĝin facile facila por analizi XML-dosiero en Objective-C.

XML- dosiero povas enhavi ion ajn de bazaj datumoj pri via programo al RSS-servo por retejo. Ili ankaŭ povas esti bonega maniero ĝisdatigi informojn ene de via programo iomete, tiel preterlasante la bezonon prezenti novan binaran al Apple simple aldoni novan eron al listo.

Do, kiel ni procesas XML-dosierojn en Xcode? La procezo enhavas paŝojn por komencigi la variablojn por esti uzataj, komencante la procezon de analizilo de XML, nutrante tiun procezon dosieron, la komencon de individua elemento, la karakteroj (valoro) ene de la elemento, la fino de individua elemento, kaj la fino de la analizo-procezo.

En ĉi tiu ekzemplo, ni analizos dosieron el interreto, pasante ĝin en aparta retadreso ( URL ).

Ni komencos konstrui la kaplinion. Ĉi tio estas ekzemplo de tre baza kaplinia dosiero por Detala Vida Kontrolilo kun la minimumaj postuloj por analizi nian dosieron:

@interface RootViewController: UITableViewController {
DetailViewController * DetalojViewController;

NSXMLParser * rssParser;
NSMutableArray * artikoloj;
NSMutableDictionary * ero;
NSString * currentElement;
NSMutableString * ElementValue;
BOOLa eraroProĉanta;
}

@property (neatoma, retenu) IBOutlet DetailViewController * detailViewController;

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

La funkcio parseXMLFileAtURL komencos la procezon por ni. Kiam ĝi finas, la "artikoloj" de NSMutableArray tenos nian datumon. La tabelo estos farita de mutable vortaroj kun klavoj rilatigitaj al la kampaj nomoj en la XML-dosiero.

Nun, ke ni starigis la variablojn necesajn, ni moviĝos al la renkontiĝo de la procezo en la .m-dosiero:

- (void) parserDidStartDocument: (NSXMLParser *) analizilo {
NSLog (@ "Dosiero trovita kaj analizanta komencita");

}

Ĉi tiu funkcio kuras ĉe la komenco de la procezo. Ne necesas meti ion ajn en ĉi tiu funkcio, sed se vi volas plenumi taskon kiam la dosiero komencas esti analizita, ĉi tie estas kie vi metus vian kodon.

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

NSString * agentString = @ "Mozilla / 5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en-us) AppleWebKit / 525.27.1 (KHTML, kiel Gecko) Versio / 3.2.1 Safaro / 525.27.1";
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:
[NSURL URLWithString: URL]];
[petu setValue: agentString forHTTPHeaderField: @ "Uzanto-Agento"];
xmlFile = [NSURLConnection sendSynchronousRequest: peto reveniResponse: nil error: nil];


artikoloj = [[NSMutableArray-atribuo] init];
errorParsing = NE;

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

// Vi eble devas turni iujn ĉi tiujn laŭ la tipo de XML-dosiero, kiun vi analizas
[rssParser setShouldProcessNamespaces: Ne];
[rssParser setShouldReportNamespacePrefiksoj: NE];
[rssParser setShouldResolveExternalEntities: Ne];

[rssParser-parse];

}

Ĉi tiu funkcio instruas la motoron por elŝuti dosieron ĉe aparta retadreso (URL) kaj komenci la procezon por analizi ĝin.

Ni rakontas al la malproksima servilo, ke ni estas Safaro kuranta sur Mac kvazaŭ la servilo provas redirekti la iPhone / iPad al poŝtelefono.

La ebloj ĉe la fino estas specifa por iuj XML-dosieroj. Plej multaj RSS-dosieroj kaj ĝeneralaj XML-dosieroj ne bezonos ilin turnitajn.

- (malplena) analizilo: (NSXMLParser *) analizilo parseErrorOccurred: (NSError *) parseError {

NSString * errorString = [NSString stringWithFormat: @ "Erara kodo% i", [parseError code]];
NSLog (@ "Eraro analizanta XML:% @", errorString);


errorParsing = Jes;
}

Ĉi tio estas simpla eraro-kontrolanta ruladon, kiu starigos binaran valoron se ĝi renkontas eraron. Vi eble bezonas ion pli specifan ĉi tie, laŭ tio, kion vi faras. Se vi simple bezonos kuri iun kodon post prilaborado en la kazo de eraro, la eraroParsanta binara variablo povas esti nomita tiam.

- (malplena) analizilo: (NSXMLParser *) analizilo didStartElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI qualifiedName: (NSString *) qName atributoj: (NSDictionary *) attributeDict {
currentElement = [elementoName-kopio];
ElementValue = [[NSMutable String alloc] init];
se ([elementName isEqualToString: @ "ero"]) {
item = [[NSMutableDictionary alloc] init];

}

}

La karno de la XML-analizilo enhavas tri funkciojn, unu, kiu funkcias komence de individua elemento, unu kiu kuras dum la mezo de analizado de la elemento, kaj unu, kiu kuras ĉe la fino de la elemento.

Por ĉi tiu ekzemplo, ni analizos dosieron simila al RSS-dosieroj, kiuj rompas elementojn en grupojn sub la titolo de "eroj" ene de la XML-dosiero. Je la komenco de la prilaborado, ni kontrolas la elementan nomon "eron" kaj atribuas nian eron-vortaron kiam nova grupo estas detektita. Alie, ni komenceblas nian variablo por la valoro.

- (malplena) analizilo: (NSXMLParser *) analizilo trovitaCarakteroj: (NSString *) string {
[ElementValue appendString: kordo];
}

Ĉi tiu estas la facila parto. Kiam ni trovas gravulojn, ni simple aldonos ilin al nia variablo "ElementValue".

- (malplena) analizilo: (NSXMLParser *) analizilo didEndElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI qualifiedName: (NSString *) qName {
se ([elementName isEqualToString: @ "ero"]) {
[artikoloj addObject: [ero kopio]];
} alia {
[ero setObject: ElementValue forKey: elementName];
}

}

Kiam ni finis prilabori elementon, ni devas fari unu el du aĵoj: (1) se la fina elemento estas "ero", ni finis nian grupon, do ni aldonos nian vortaron al nia tabelo de "artikoloj ".

Aŭ (2) se la elemento ne estas "ero", ni starigos la valoron en nia vortaro kun ŝlosilo, kiu kongruas kun la nomo de la elemento. (Ĉi tio signifas, ke ni ne bezonas individuan variablo por ĉiu kampo ene de la XML-dosiero. Ni povas procesi ilin iom pli dinamike).

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

se (errorParsing == NO)
{
NSLog (@ "XML-pretigo farita!");
} alia {
NSLog (@ "Eraro okazis dum XML-pretigo");
}

}

Ĉi tiu estas la lasta funkcio necesa por nia analizado de rutino. Ĝi simple finas la dokumenton. Vi metos ajnan kodon, kiun vi volas fini ĉi tie, aŭ ĉion ajn specialan vi eble volas fari en eraro.

Unu afero multaj programoj eble volas fari ĉi tie estas konservi la datumon kaj / aŭ XML-dosieron al dosiero en la aparato. De ĉi tiu maniero, se la uzanto ne estas konektita al Interreto la venontan fojon ili ŝarĝas la programon, ili ankoraŭ povas atingi ĉi tiun informon.

Kompreneble, ni ne povas forgesi la plej gravan parton: diranta vian peton por analizi la dosieron (kaj doni al ĝi retadreson por trovi ĝin ĉe!).

Por komenci la procezon, vi simple bezonas aldoni ĉi tiun linion de kodo al la taŭga loko, kie vi volas fari la XML-pretigon:

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