XML-tiedostojen jäsentäminen Xcode-muodossa

Yksi yksinkertainen tehtävä, joka on monien sovellusten selkäranka, on kyky jäsentää XML-tiedostoja. Ja onneksi Xcode tekee suhteellisen helppoa jäsentää XML-tiedostoa tavoite-C: ssä.

XML- tiedosto voi sisältää mitään sovelluksen perustiedoista verkkosivuston RSS-syötteeseen . Ne voivat myös olla erinomainen tapa päivittää tietoja sovelluksessasi etäyhteyden kautta. Näin ohitetaan tarve toimittaa uusi binääri Applelle yksinkertaisesti lisäämällä uusi kohde luetteloon.

Joten miten XML-tiedostot käsitellään Xcode-järjestelmässä? Prosessi sisältää vaiheet käytettävien muuttujien alustukseen, XML-jäsentimen prosessin käynnistämisen, prosessin syötteen syöttämisen, yksittäisen elementin alkamisen, elementtien merkkien (arvon) yksittäisen elementin loppu ja jäsentämisprosessin loppu.

Tässä esimerkissä jäsennämme tiedostoa Internetistä antamalla sille tietyn URL-osoitteen .

Aloitamme luomalla otsikkotiedoston. Tämä on esimerkki erittäin yksityiskohtaisesta otsikkotiedostosta Detail View Controller -ohjelmaan, jolla on vähimmäisvaatimukset tiedostojen jäsentämiselle:

@interface RootViewController: UITableViewController {
DetailViewController * detailViewController;

NSXMLParser * rssParser;
NSMutableArray * artikkelit;
NSMutableDictionary * kohde;
NSString * currentElement;
NSMutableString * ElementValue;
BOOL errorParsing;
}

@property (ei atominen, säilytä) IBOutlet DetailViewController * detailViewController;

- (tyhjä) parseXMLFileAtURL: (NSString *) URL;

ParseXMLFileAtURL-funktio käynnistää prosessin meille. Kun se päättyy, NSMutableArray-artikkelit pitävät tietomme. Määritelmä koostuu muuttuvista sanakirjoista, jotka sisältävät XML-tiedoston kenttien nimet.

Nyt kun olemme määrittäneet tarvittavat muuttujat, siirrymme .m-tiedoston proseduuriin:

- (void) parserDidStartDocument: (NSXMLParser *) parser {
NSLog (@ "Arkisto löytyi ja jäsentely alkoi");

}

Tämä toiminto suoritetaan prosessin alussa. Ei ole mitään tarvetta laittaa mitään tähän toimintoon, mutta jos haluat suorittaa tehtävän, kun tiedosto alkaa jäsentää, tämä on paikka, jossa laitat koodisi.

- (tyhjä) parseXMLFileAtURL: (NSString *) URL
{

NSString * agentString = @ "Mozilla / 5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en-us) AppleWebKit / 525.27.1 (KHTML, kuten Gecko) Version / 3.2.1 Safari / 525.27.1";
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:
[NSURL URLWithString: URL]];
[request setValue: agentString forHTTPHeaderField: @ "Käyttäjäagentti"];
xmlFile = [NSURLConnection sendSynchronousRequest: request returningResponse: nil error: nil];


artikkelit = [[NSMutableArray alloc] init];
errorParsing = NO;

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

// Voit ehkä kääntää joitain niistä riippuen XML-tiedoston tyypistä, jonka jäsennät
[rssParser setShouldProcessNamespaces: NO];
[rssParser setShouldReportNamespacePrefixes: NO];
[rssParser setShouldResolveExternalEntities: EI];

[rssParser parse];

}

Tämä toiminto ohjaa moottoria lataamaan tiedoston tietylle www-osoitteelle (URL) ja aloittamaan sen jäsentämisen prosessin.

Olemme kertoneet etäpalvelimelle, että olemme Safari käytössä Macissa vain, jos palvelin yrittää ohjata iPhonen / iPad mobiiliversiolle.

Loppujen vaihtoehdot ovat tiettyjä XML-tiedostoja. Useimmat RSS-tiedostot ja yleiset XML-tiedostot eivät tarvitse niitä käynnistyneitä.

- (tyhjä) parseri: (NSXMLParser *) parser parseErrorOccurred: (NSError *) parseError {

NSString * errorString = [NSString stringWithFormat: @ "Virhekoodi% i", [parseError-koodi]];
NSLog (@ "XML: n jäsentämisen virhe:% @", errorString);


errorParsing = KYLLÄ;
}

Tämä on yksinkertainen virheiden tarkistusreititys, joka asettaa binääriarvon, jos se havaitsee virheen. Saatat tarvita jotain tarkempaa täällä riippuen siitä, mitä teet. Jos sinun on yksinkertaisesti suoritettava jonkin koodin käsittelyn jälkeen virheen tapauksessa, virheparsing-binaarimuuttujaa voidaan kutsua tuolloin.

(NSXMLParser *) jäsentimen didStartElement: (NSString *) elementName nimiavaruusURI: (NSString *) nimiavaruusURI qualifiedName: (NSString *) qName attribuutit: (NSDictionary *) attributeDict {
currentElement = [elementName kopio];
ElementValue = [[NSMutableString alloc] init];
jos ([elementName isEqualToString: @ "kohde"]) {
kohde = [[NSMutableDictionary alloc] init];

}

}

XML-jäsentimen lihassa on kolme funktiota, joka toimii yksittäisen elementin alussa, joka toimii elementin jäsentämisen keskellä ja joka toimii elementin lopussa.

Tässä esimerkissä käsittelemme RSS-tiedostojen kaltaista tiedostoa, joka jakaa elementit ryhmiin XML-tiedoston otsikoiden alla. Käsittelyn alussa tarkistamme elementin nimen "kohteen" ja kohdistamalla kohde-sanakirja, kun uusi ryhmä havaitaan. Muussa tapauksessa alustamme muuttujamme arvoon.

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

Tämä on helppo osa. Kun löydämme merkkejä, lisäämme ne vain muuttujan "ElementValue".

- (tyhjä) parseri: (NSXMLParser *) jäsennin didEndElement: (NSString *) elementName nimiavaruusURI: (NSString *) nimiavaruusURI qualifiedName: (NSString *) qName {
jos ([elementName isEqualToString: @ "kohde"]) {
[articles addObject: [item copy]];
} else {
[item setObject: ElementValue forKey: elementName];
}

}

Kun olemme suorittaneet elementin käsittelyn, meidän on tehtävä yksi kahdesta asiasta: (1) jos loppuosa on "kohde", olemme lopettaneet ryhmän, joten lisäämme sanakirjaamme joukkoon "artikkeleita ".

Tai (2) jos elementti ei ole "kohde", asetamme sanakirjamme arvoon avaimella, joka vastaa elementin nimeä. (Tämä tarkoittaa sitä, että XML-tiedostossa ei tarvitse yksittäistä muuttujaa kullakin kentällä. Voimme käsitellä niitä hieman dynaamisemmin.)

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

jos (errorParsing == EI)
{
NSLog (@ "XML processing done!");
} else {
NSLog (@ "XML-käsittelyn aikana tapahtunut virhe");
}

}

Tämä on viimeinen toiminto, jota tarvitaan jäsentämisen rutiinille. Se lopettaa asiakirjan. Voit laittaa minkä tahansa koodin, jonka haluat lopettaa prosessin täällä tai mikä tahansa erikoinen, jonka haluat tehdä virheen sattuessa.

Yksi asia, jota monet sovellukset haluavat tehdä tässä, on tallentaa tiedot ja / tai XML-tiedosto tiedostoon laitteessa. Näin ollen, jos käyttäjä ei ole yhteydessä Internetiin seuraavan kerran lataamalla sovelluksen, he voivat silti saada nämä tiedot.

Tietenkään emme voi unohtaa tärkeintä osaa: kerrotaan hakemuksessasi jäsentää tiedosto (ja antamalla sille verkkosivun löytää se osoitteessa!).

Aloita prosessi, sinun tarvitsee vain lisätä tämä rivi koodilla sopivaan paikkaan, jossa haluat tehdä XML-käsittelyn:

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