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.
Miten XML-tiedostoja käsitellään Xcode-järjestelmässä? Prosessi sisältää vaiheet käytettävien muuttujien alustukseen, XML-jäsentimen prosessin käynnistämiseen, prosessin syötteen syöttämiseen, yksittäisen elementin alkuun, elementtien sisältämien merkkien (arvon), yksittäisen elementin loppuun ja loppuun jäsentämisprosessista.
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ätrssParser 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 arvon sanakirjaan 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";