XML-fájlok elemzése Xcode-ban

Bár beépített XML az elemző valódi értéket ad egy új asztali vagy mobilalkalmazáshoz, a kódoláshoz általában sok fejlesztési idő és béta teszt szükséges. Az Apple Xcode programja tartalmaz egy XML elemzőt, amely megkerüli a kézi munka nagy részét.

An XML fájl bármit tartalmazhat, az alkalmazásod alapadataitól az RSS-hírcsatorna egy weboldalhoz. Nagyszerű módja lehet az alkalmazáson belüli információk frissítésének távolról is, elkerülve ezzel az új bináris fájlok beküldésének szükségességét az Apple számára, hogy új elemeket vegyen fel a listára.

Az Xcode folyamat

A beépített Xcode folyamat tartalmazza a használandó változók inicializálásának lépéseit, az XML-elemző folyamat elindítását, a folyamat betáplálását egy fájlba, az egyes elemek és az ezeken belüli karakterek (érték) értékelése, az egyes elemek végének felismerése és az elemzés befejezése folyamat.

Használja az XML elemzőt

A részletek illusztrálásához elemezünk egy példa fájlt az internetről egy adott webcím továbbításával (URL).

instagram viewer

Kezdje a fejlécfájl elkészítésével. Ez egy példa a Detail View Controller nagyon egyszerű fejlécfájljára, amely a fájlunk elemzéséhez szükséges minimális követelményeket tartalmazza:

@interface RootViewController: UITableViewController {
DetailViewController * detailViewController;
NSXMLParser * rssParser;
NSMutableArray * cikkek;
NSMutableDictionary * elem;
NSString * currentElement;
NSMutableString * ElementValue;
BOOL hibaPárolás;
}
@property (nonatomic, retain) IBOutlet DetailViewController * detailViewController;
- (void) parseXMLFileAtURL: (NSString *) URL;


A parseXMLFileAtURL függvény elindítja a folyamatot. Amikor befejeződik, az NSMutableArray "cikkek" tárolják az adatokat. A tömb változtatható szótárakból áll, kulcsokkal, amelyek az XML fájl mezőneveihez kapcsolódnak.

Ezután inicializálja a folyamatot:

- (void) parserDidStartDocument: (NSXMLParser *) parser {
NSLog (@ "A fájl megtalálva és az elemzés elindult");
}

Ez a funkció a folyamat elején fut. Nem kell semmit beletenni ebbe a függvénybe, de ha egy feladatot el akar végezni, amikor a fájl elemzése elkezdődik, akkor ide tenné a kódját.

Utasítsa a programot, hogy töltsön le valamit

Ezután utasítsa a programot, hogy töltsön le valamit:

- (void) parseXMLFileAtURL: (NSString *) URL
{
NSString * agentString = @ "Mozilla / 5.0 (Macintosh; U; Intel Mac OS X 10_5_6; hu-us) AppleWebKit / 525.27.1 (KHTML, mint a Gecko) Verzió / 3.2.1 Safari / 525.27.1 ";
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:
[NSURL URLWithString: URL]];
[request setValue: agentString forHTTPHeaderField: @ "User-Agent"];
xmlFile = [NSURLConnection sendSynchronousRequest: request returningResponse: nulla hiba: nulla];
cikkek = [[NSMutableArray kiosztás] init];
errorParsing = NO;
rssParser = [[NSXMLParser kiosztás] initWithData: xmlFile];
[rssParser setDelegate: self];
// Lehet, hogy ezek közül néhányat meg kell fordítania, az elemzett XML fájl típusától függően
[rssParser setShouldProcessNamespaces: NO];
[rssParser setShouldReportNamespacePrefixes: NO];
[rssParser setShouldResolveExternalEntities: NO];
[rssParser elemzés];
}


Ez a funkció utasítja a motort, hogy töltsön le egy fájlt egy adott webcímre (URL), és kezdje meg annak elemzését. Azt mondjuk a távoli kiszolgálónak, hogy mi egy Mac-en futó Safari vagyunk, arra az esetre, ha a szerver megpróbálja átirányítani az iPhone / iPad készüléket mobil verzióra.

A végén található opciók bizonyos XML fájlokra vonatkoznak. A legtöbb RSS-fájlt és általános XML-fájlt nem kell bekapcsolni.

Hiba - ellenőrizze az eredményt

Végezzen el néhány alapvető hibaellenőrzést az eredményen:

- (void) parser: (NSXMLParser *) parser parseErrorOccurrent: (NSError *) parseError {
NSString * errorString = [NSString stringWithFormat: @ "% i hibakód", [parseError kód]];
NSLog (@ "Hiba az XML elemzése során:% @", errorString);
errorParsing = IGEN;
} Ez a hibát ellenőrző útválasztás bináris értéket állít be, ha hibával találkozik. Szüksége lehet valami konkrétabbra itt, attól függően, hogy mit csinál. Ha hiba esetén egyszerűen feldolgoznia kell egy kódot, akkor a


Ez a hibát ellenőrző rutin bináris értéket állít be, ha hibával találkozik. Szüksége lehet valami konkrétabbra itt, attól függően, hogy mit csinál. Ha hiba esetén a feldolgozás után egyszerűen futtatnia kell egy kódot, akkor a bináris változót elemző hibát akkor meghívhatjuk.

Elemezze a visszakeresett tartalmat

Ezután a program lebontja a visszakeresett tartalmat és elemzi:

- (void) elemző: (NSXMLParser *) értelmező didStartElement: (NSString *) elemNév névtérURI: (NSString *) névtérURI képzettNév: (NSString *) qNév attribútumok: (NSDictionary *) attributeDict {
currentElement = [elemNév másolat];
ElementValue = [[NSMutableString allokáció] init];
if ([elemNév isEqualToString: @ "item"]) {
elem = [[NSMutableDictionary allokálás] init];
}
}


Az XML-elemző húsa három funkciót tartalmaz, az egyik az egyén elején fut elem, amely az elemzés közepén fut, és amely az elem végén fut elem.

Ebben a példában az RSS fájlokhoz hasonló fájlt elemzünk, amely az elemeket csoportokra bontja elemeket az XML fájlban. A feldolgozás kezdetekor ellenőrizzük az "item" elem nevet, és új csoport észlelésekor lefoglaljuk az elem szótárunkat. Ellenkező esetben a változónkat inicializáljuk az értékre:

- (void) elemző: (NSXMLParser *) elemző találhatóKarakterek: (NSString *) karakterlánc {
[ElementValue appendString: string];
}


Ha karaktereket találunk, egyszerűen hozzáadjuk őket a változónkhoz ElementValue:

- (void) elemző: (NSXMLParser *) elemző didEndElement: (NSString *) elemNév névtérURI: (NSString *) névtérURI képzettNév: (NSString *) qNév {
if ([elemNév isEqualToString: @ "item"]) {
[cikkek addObject: [elem másolat]];
} más {
[item setObject: ElementValue forKey: elemNév];
}
}

Mi történik, ha az elemzés befejeződött

Amikor a program befejezi az elem feldolgozását, két dolog egyikét kell tennie:

  • Ha a végelem tétel, befejeztük a csoportunkat, ezért hozzáadjuk szótárunkat a cikkek tömbjéhez.
  • Ha az elem nem tétel, a szótárunkban beállítunk egy értéket az elem nevének megfelelő kulccsal. (Ez azt jelenti, hogy nincs szükségünk egyedi változóra az XML fájl minden mezőjéhez. Kicsit dinamikusabban tudjuk feldolgozni őket.)

Ez az utolsó funkció, amely elemzési rutinunkhoz szükséges; befejezi a dokumentumot. Írjon ide bármilyen végső kódot, vagy adjon meg egy hibajavító alprogramot:

- (void) parserDidEndDocument: (NSXMLParser *) parser {
if (errorParsing == NEM)
{
NSLog (@ "XML feldolgozás kész!");
} más {
NSLog (@ "Hiba történt az XML feldolgozása során");
}
}

Mentse az adatokat

Egy dolog, amit sok alkalmazásnak érdemes lehet megtennie, az az, hogy az adatokat vagy az XML-fájlokat elmenti a készüléken található fájlokba. Így, ha a készülék nem csatlakozik az internethez az alkalmazás következő betöltésekor, akkor is hozzájuthat ehhez az információhoz.

Természetesen nem feledkezhetünk meg a legfontosabb részről sem: utasíthatjuk az alkalmazást, hogy elemezzük a fájlt (és adjunk webcímet, hogy megtalálja!). A folyamat megkezdéséhez adja hozzá ezt a kódsort a megfelelő helyre, ahol az XML-feldolgozást szeretné elvégezni:

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