Kako analizirati XML datoteke v Xcode

Ena preprosta naloga, ki je hrbtenica mnogim aplikacijam, je zmožnost razčlenjevanja datotek XML. In na srečo, Xcode omogoča relativno enostavno razčlenjevanje datoteke XML v Objective-C.

Datoteka XML lahko vsebuje vsebino iz osnovnih podatkov o vaši aplikaciji v spletni vir RSS . Prav tako so lahko odličen način posodabljanja podatkov v vaši aplikaciji na daljavo, zato mimo potrebe po predložitvi nove binarne naprave Apple preprosto dodate nov element na seznam.

Torej, kako lahko obdelujemo datoteke XML v Xcode? Postopek vsebuje korake za inicializacijo spremenljivk, ki jih je treba uporabiti, zaženite postopek razčlenjevanja XML, podajte ta proces datoteko, začetek posameznega elementa, znake (vrednost) znotraj elementa, konec posameznega elementa in konec procesa razčlenjevanja.

V tem primeru bomo datoteko razčlenili iz interneta, tako da bomo posredovali določen spletni naslov ( URL ).

Začeli bomo s sestavljanjem glave datoteke. To je primer zelo osnovne datoteke glave za krmilnik podrobnega pogleda z minimalnimi zahtevami za razčlenjevanje naše datoteke:

@interface RootViewController: UITableViewController {
DetailViewController * detailViewController;

NSXMLParser * rssParser;
NSMutableArray * članki;
NSMutableDictionary * element;
NSString * currentElement;
NSMutableString * ElementValue;
BOOL errorParsing;
}

@property (nonatomic, zadrži) IBOutlet DetailViewController * detailViewController;

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

Funkcija parseXMLFileAtURL bo za nas začela postopek. Ko se konča, bodo "podatki" NSMutableArray vsebovali naše podatke. Matrika bo sestavljena iz izmenljivih slovarjev s ključi, povezanimi z imeni polj v datoteki XML.

Zdaj, ko smo nastavili potrebne spremenljivke, bomo v datoteko .m prešli na srečanje procesa:

- (void) parserDidStartDocument: (NSXMLParser *) razčlenjevalnik {
NSLog (@ "Najdena datoteka in razčiščen začetek");

}

Ta funkcija se izvaja na začetku postopka. V tej funkciji ni treba ničesar dati, toda če želite opraviti nalogo, ko se datoteka začne razčleniti, je to, kamor bi dali kodo.

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

(Windows NT 5.1; WOW64; U; ru-RU);
NSMutableURLRequest * zahteva = [Zahtevana zahteva NSMutableURLRequestWithURL:
[NSURL URLWithString: URL]];
[request setValue: agentString zaHTTPHeaderField: @ "User-Agent"];
xmlFile = [NSURLConekcija pošiljanjaSinhronoRequest: zahtevek za vračiloResponse: ničelna napaka: nil];


articles = [[NSMutableArray alloc] init];
errorParsing = NE;

rssParser = [[NSXMLParser dodelitev] initWithData: xmlFile];
[rssParser setDelegacija: samo];

// Morda boste morali nekatere od njih spremeniti, odvisno od vrste XML datoteke, ki jo razčleni
[rssParser setShouldProcessNamespaces: NE];
[rssParser setShouldReportNamespacePrefixes: NE];
[rssParser setShouldResolveExternalEntities: NE];

[rssParser parse];

}

Ta funkcija navodila motorju, da prenese datoteko na določen spletni naslov (URL) in začne postopek za njegovo razčlenjevanje.

Oddaljenemu strežniku povemo, da smo Safari na Macu, če poskušamo preusmeriti iPhone / iPad v mobilno različico.

Možnosti na koncu so specifične za določene datoteke XML. Večina RSS datotek in generičnih XML datotek ne potrebujejo, da so vklopljeni.

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

NSString * errorString = [NSString stringWithFormat: @ "Koda napake% i", [parseError code]];
NSLog (@ "Napaka pri razčlenjevanju XML:% @", errorString);


errorParsing = DA;
}

To je preprosta usmeritev preverjanja napak, ki bo nastavila binarno vrednost, če pride do napake. Morda boste potrebovali nekaj bolj natančnega, odvisno od tega, kaj počnete. Če morate preprosto zagnati kodo po obdelavi v primeru napake, se lahko v tem času pokliče binarna spremenljivka errorParsing.

- (void) razčlenjevalnik: (NSXMLParser *) razčlenjevalnik didStartElement: (NSString *) elementName namespaceURI: (NSString *) prostor names namesURI qualifiedName: (NSString *) qName atributi: (NSDictionary *) atributDict {
currentElement = [elementName kopija];
ElementValue = [[NSMutableString dodelitev] init];
če ([elementName jeEqualToString: @ "element"])) {
item = [[NSMutableDictionary alloc] init];

}

}

Meso razčlenjevalnika XML vsebuje tri funkcije, tiste, ki se izvajajo na začetku posameznega elementa, tisti, ki se izvaja sredi razčlenjevanja elementa in tisti, ki poteka na koncu elementa.

V tem primeru bomo razčlenili datoteko, podobno datotekam RSS, ki razčlenjujejo elemente v skupine pod naslovom »elementi« v datoteki XML. Na začetku obdelave preverjamo ime elementa "element" in dodelimo naš slovar elementov, ko je nova skupina zaznana. V nasprotnem primeru inicializiramo spremenljivko za vrednost.

- (void) razčlenjevalnik: (NSXMLParser *) najdeno razčlenjevalce: (NSString *) niz {
[ElementValue appendString: niz];
}

To je preprost del. Ko najdemo znake, jih enostavno dodamo v našo spremenljivko "ElementValue".

- (void) razčlenjevalnik: (NSXMLParser *) razčlenjevalnik didEndElement: (NSString *) elementName namespaceURI: (NSString *) prostor namespaceURI qualifiedName: (NSString *) qName {
če ([elementName jeEqualToString: @ "element"])) {
[članki addObject: [kopija izdelka]];
} drugo {
[element setObject: ElementValue forKey: elementName];
}

}

Ko končamo z obdelavo elementa, moramo storiti eno od dveh stvari: (1) če je končni element "element", smo končali našo skupino, zato bomo slovaru dodali v našo paleto "člankov ".

Ali (2), če element ni element, bomo vrednost v našem slovarju nastavili s ključem, ki se ujema z imenom elementa. (To pomeni, da za vsako polje v datoteki XML ne potrebujemo posamezne spremenljivke. Lahko jih obdelamo malo bolj dinamično.)

- (void) parserDidEndDocument: (NSXMLParser *) razčlenjevalnik {

if (errorParsing == NE)
{
NSLog (@ "XML obdelava opravljena!");
} drugo {
NSLog (@ "Prišlo je do napake med obdelavo XML-a");
}

}

To je zadnja funkcija, ki je potrebna za našo rutinsko analizo. Dokument preprosto konča. Vstavili boste poljubno kodo, ki jo želite dokončati tukaj, ali pa kaj posebnega, kar bi morda želeli storiti v primeru napake.

Ena stvar, ki bi jo morda želele storiti številne aplikacije, je shranjevanje podatkov in / ali datoteke XML v datoteko v napravi. Na ta način, če uporabnik ob naslednjem obremenitvi aplikacije še ni povezan z internetom, lahko še vedno dobijo te podatke.

Seveda ne moremo pozabiti na najpomembnejši del: povedati vaši aplikaciji, da razčleni datoteko (in ji daste spletni naslov, da jo najdete na!).

Če želite začeti postopek, morate to vrstico kode preprosto dodati na ustrezen kraj, kjer želite obdelati XML:

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