{"id":3404,"date":"2010-05-17T12:11:30","date_gmt":"2010-05-17T10:11:30","guid":{"rendered":"http:\/\/www.devapp.it\/wordpress\/?p=3404"},"modified":"2010-05-17T12:12:48","modified_gmt":"2010-05-17T10:12:48","slug":"t042-come-utilizzare-xml-nelle-nostre-applicazioni-iphone-sdk","status":"publish","type":"post","link":"https:\/\/www.devapp.it\/wordpress\/t042-come-utilizzare-xml-nelle-nostre-applicazioni-iphone-sdk\/","title":{"rendered":"T#042 &#8211; Come utilizzare XML nelle nostre applicazioni iPhone (SDK)"},"content":{"rendered":"<p><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/t042_xml_screenshot_09.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/t042_xml_screenshot_09.png\" alt=\"T042 - XML Screenshot 09\" title=\"t042_xml_screenshot_09\" width=\"52\" height=\"96\" class=\"alignleft size-full wp-image-3414\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/t042_xml_screenshot_09.png 414w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/t042_xml_screenshot_09-161x300.png 161w\" sizes=\"auto, (max-width: 52px) 100vw, 52px\" \/><\/a> Eccoci con un nuovo tutorial dedicato alla programmazione per iPhone. Oggi vedremo come integrare nelle nostre applicazioni iPhone (e iPad) una tecnologia molto utilizzata, specialmente in ambito web: stiamo parlando di XML. Vedremo, quindi, come leggere un file XML, da cui preleveremo delle informazioni che abbiamo salvato. Questa operazione verr\u00e0 eseguita in locale (ovvero il file xml sar\u00e0 all&#8217;interno del nostro progetto), ma nulla ci vieta di avere il file caricato su un server web da cui accediamo tramite la nostra applicazione.<!--more--><\/p>\n<h4>1. Cosa \u00e8 XML?<\/h4>\n<p><strong>XML<\/strong> \u00e8 un metalinguaggio (in quanto non \u00e8 un linguaggio di programmazione vero e proprio) di markup, ovvero un linguaggio che consente di estendere o controllare il comportamento di altri linguaggi. Il linguaggio di markup pi\u00f9 famoso \u00e8 sicuramente l&#8217;HTML, che ha molte analogie con l&#8217;XML.<br \/>\nXML \u00e8 l&#8217;acronimo di <strong>eXtensible Markup Language<\/strong>, da cui possiamo capire la caratteristica fondamentale di questo linguaggio: ci permette di creare <strong>tag personalizzati<\/strong>, in base alle nostre esigenze.<\/p>\n<p>Sar\u00e0 pi\u00f9 semplice comprendere come funziona questo linguaggio mediante un esempio:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/t042_xml_screenshot_01.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/t042_xml_screenshot_01.png\" alt=\"T042 - XML Screenshot 01\" title=\"t042_xml_screenshot_01\" width=\"304\" height=\"196\" class=\"aligncenter size-full wp-image-3405\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/t042_xml_screenshot_01.png 304w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/t042_xml_screenshot_01-300x193.png 300w\" sizes=\"auto, (max-width: 304px) 100vw, 304px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>La prima riga definisce la versione di XML in uso e la codifica utilizzata (secondo le norme ISO). Dalla seconda riga in poi, invece, troviamo dei tag personalizzati, che vanno a modellare i dati a nostro piacimento.<br \/>\nPossiamo vedere come abbiamo definito il tag generale &#8220;studenti&#8221;, che viene iniziato alla seconda riga e concluso all&#8217;ultima. Nel mezzo troviamo, invece, altri tag, che riportano le informazioni che vogliamo memorizzare, per poi utilizzarle a nostro piacimento.<\/p>\n<p>Ci sono alcune piccole regole da rispettare nella sruttura XML:<\/p>\n<ul>\n<li>I tag non possono iniziare con numeri o caratteri speciali e non possono contenere spazi.<br \/>\n      Corretti: <nome>, <cognome>, <dataDiNascita><br \/>\n      Errati: <&#038;soldi>, <12peso>, <anno di nascita><\/li>\n<li>I tag devono essere bilanciati (ogni tag aperto deve essere chiuso)<br \/>\n      Corretto: <nome>Andrea<\/nome><br \/>\n      Errato: <nome>Andrea<\/li>\n<li>I tag non devono contenere errori di annidamento.<br \/>\n      Ecco alcuni esempi errati:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/t042_xml_screenshot_02.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/t042_xml_screenshot_02.png\" alt=\"T042 - XML Screenshot 02\" title=\"t042_xml_screenshot_02\" width=\"198\" height=\"217\" class=\"aligncenter size-full wp-image-3406\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/t042_xml_screenshot_02.png 198w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/t042_xml_screenshot_02-136x150.png 136w\" sizes=\"auto, (max-width: 198px) 100vw, 198px\" \/><\/a><br \/>\n<\/center>\n<\/li>\n<li>Si possono inserire degli attributi all\u2019interno dei tag; la struttura sar\u00e0 quindi la segente:<br \/>\n<nometag attributo1=\"valore1\" attributo2=\"valore2\">  Valore <\/nometag><br \/>\nI nostri elementi, quindi, potranno essere scritti anche nella seguente maniera:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/t042_xml_screenshot_03.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/t042_xml_screenshot_03.png\" alt=\"T042 - XML Screenshot 03\" title=\"t042_xml_screenshot_03\" width=\"276\" height=\"182\" class=\"aligncenter size-full wp-image-3407\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/t042_xml_screenshot_03.png 276w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/t042_xml_screenshot_03-150x98.png 150w\" sizes=\"auto, (max-width: 276px) 100vw, 276px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Questa struttura \u00e8 del tutto uguale a quella precedente. Notate che in questo caso non abbiamo usato il tag di chiusura, ma abbiamo inserito &#8220;\/&#8221; all\u2019interno del tag stesso proprio per indicare che quel tag non ha elemento di chiusura. Quello che cambier\u00e0 sar\u00e0 solamente il modo di leggere i valori via codice.<\/li>\n<\/ul>\n<h4>2. XML nell\u2019SDK di iPhone<\/h4>\n<p>Per ora abbiamo fatto una panoramica su XML in generale, presentando gli aspetti fondamentali di tale linguaggio. Ma come possiamo integrarlo con le nostre applicazioni? L&#8217;oggetto che si occupa di recuperare i dati da un file XML viene detto <strong>parser<\/strong>.<\/p>\n<p>Esistono vari tipi di parser (diversi per linguaggi e tecnologie), noi andremo ad utilizzare SAX. La caratteristica di questo parser sta nel fatto che processa i documenti linea per linea: dati a cui si \u00e8 acceduto in precedenza non possono essere riletti senza la rielaborazione dell&#8217;intero documento. Pu\u00f2 essere uno svantaggio, ma \u00e8 l&#8217;unico parser disponibile nell&#8217;SDK per iPhone!!<\/p>\n<h4>3. Creiamo un nuovo progetto<\/h4>\n<p>Aprimo Xcode e selezioniamo &#8220;File -> New Project&#8221;. Nel men\u00f9 che ci appare selezioniamo &#8220;View-Based Application&#8221;, clicchiamo su &#8220;Choose\u2026&#8221;, immettiamo come nome &#8220;xmlTutorial&#8221; e facciamo clic su &#8220;Save&#8221;. Abbiamo cos\u00ec creato il nostro nuovo progetto.<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/t042_xml_screenshot_04.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/t042_xml_screenshot_04.png\" alt=\"T042 - XML Screenshot 04\" title=\"t042_xml_screenshot_04\" width=\"500\" height=\"383\" class=\"aligncenter size-full wp-image-3408\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/t042_xml_screenshot_04.png 500w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/t042_xml_screenshot_04-300x229.png 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/t042_xml_screenshot_04-150x114.png 150w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>In questo tutorial utilizzeremo la vista e la classe che XCode ha gi\u00e0 definito per noi. Prima di definire l&#8217;aspetto grafico, per\u00f2, dichiariamo i componenti che ci servono. Apriamo il file &#8220;xmlTutorialViewController.h&#8221; e modifichiamolo cos\u00ec:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n#import <UIKit\/UIKit.h>\r\n \r\n@interface xmlTutorialViewController : UIViewController {\r\n\tIBOutlet UITextView *textArea;\r\n \r\n\tNSString *path;\r\n}\r\n \r\n-(IBAction)avviaParsing;\r\n \r\n@end\r\n<\/pre>\n<p>Abbiamo dichiarato una UITextView (riga 4) in cui inseriremo i dati letti dal file xml, un&#8217;azione (riga 6), che andr\u00e0 collegata ad un bottone (tale azione far\u00e0 iniziare il processo di parsing) e una stringa che conterr\u00e0 il percorso del file xml.<\/p>\n<p>Salviamo il file (&#8220;File -> Save&#8221;).<\/p>\n<h4>4. Creiamo la struttura grafica<\/h4>\n<p>Apriamo ora il file &#8220;xmlTutorialViewControlle.xib&#8221;, che avvier\u00e0 Interface Builder. Nella nostra applicazione, inseriamo un bottone e una TextView, di dimensioni abbastanza ampie, in quanto dovr\u00e0 contenere tutti i valori letti dal nostro file xml. Dovreste ottenere un risultato come questo:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/t042_xml_screenshot_05.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/t042_xml_screenshot_05.png\" alt=\"T042 - XML Screenshot 05\" title=\"t042_xml_screenshot_05\" width=\"400\" height=\"582\" class=\"aligncenter size-full wp-image-3409\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/t042_xml_screenshot_05.png 400w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/t042_xml_screenshot_05-206x299.png 206w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/t042_xml_screenshot_05-103x149.png 103w\" sizes=\"auto, (max-width: 400px) 100vw, 400px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Ora, selezionando l&#8217; UITextView, entriamo in &#8220;Attributes Inspector&#8221;, togliamo quindi la spunta da &#8220;Editable&#8221;:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/t042_xml_screenshot_06.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/t042_xml_screenshot_06.png\" alt=\"T042 - XML Screenshot 06\" title=\"t042_xml_screenshot_06\" width=\"301\" height=\"159\" class=\"aligncenter size-full wp-image-3410\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/t042_xml_screenshot_06.png 301w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/t042_xml_screenshot_06-300x158.png 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/t042_xml_screenshot_06-150x79.png 150w\" sizes=\"auto, (max-width: 301px) 100vw, 301px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>questo perch\u00e8 non vogliamo che l&#8217;utente possa modificare i valori presenti nella TextView (ovvero deve essere di sola lettura).<\/p>\n<p>Dal pannello dei documenti (&#8220;Tools -> Reveal in Document Window&#8221;) selezioniamo &#8220;File&#8217;s Owner&#8221;, ovvero la classe che gestisce il nostro file.<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/t042_xml_screenshot_07.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/t042_xml_screenshot_07.png\" alt=\"T042 - XML Screenshot 07\" title=\"t042_xml_screenshot_07\" width=\"385\" height=\"336\" class=\"aligncenter size-full wp-image-3411\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/t042_xml_screenshot_07.png 385w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/t042_xml_screenshot_07-300x261.png 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/t042_xml_screenshot_07-150x130.png 150w\" sizes=\"auto, (max-width: 385px) 100vw, 385px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Apriamo il &#8220;Connections Inspector&#8221; e qui, potremo vedere alcuni elementi, compresi i due che abbiamo definito noi all&#8217;inizio del nostro progetto. Colleghiamo &#8220;textArea&#8221; con la UITextView presente nella nostra vista, e l&#8217;azione &#8220;avviaParsing&#8221; con il bottone: quando apparir\u00e0 il men\u00f9 con tutte le azioni disponibili, selezioniamo &#8220;Touch Up Inside&#8221;. Se avrete eseguito tutto correttamente avrete un pannello che si presenter\u00e0 cos\u00ec:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/t042_xml_screenshot_08.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/t042_xml_screenshot_08.png\" alt=\"T042 - XML Screenshot 08\" title=\"t042_xml_screenshot_08\" width=\"301\" height=\"236\" class=\"aligncenter size-full wp-image-3412\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/t042_xml_screenshot_08.png 301w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/t042_xml_screenshot_08-300x235.png 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/t042_xml_screenshot_08-150x117.png 150w\" sizes=\"auto, (max-width: 301px) 100vw, 301px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Abbiamo terminato la creazione della struttura grafica. Possiamo salvare tutto e chiudere Interface Builder.<\/p>\n<h4>5. Scriviamo il codice necessario<\/h4>\n<p>Prima di procedere con il codice necessario, dobbiamo inserire all&#8217;interno del progetto il file xml con i nostri dati, semplicemente trascinandolo all&#8217;interno di &#8220;Resources&#8221; in &#8220;Groups &#038; Files&#8221;. Se avete capito la struttura di tali file, potete creare uno a vostro piacimento (fate attenzione a salvarlo con <strong>estensione .xml<\/strong>), altrimenti potete utilizzare nel vostro progetto il nostro <a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/dati.zip\" target=\"_blank\">file di esempio<\/a>.<\/p>\n<p>Apriamo ora il file &#8220;xmlTutorialViewController.m&#8221; e definiamo il seguente metodo:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n\/\/ Metodo eseguito all'avvio della vista\r\n- (void)viewDidLoad {\r\n    [super viewDidLoad];\r\n\t\/\/ definiamo il percorso del file xml\r\n\tNSString *pathProgetto = [[NSBundle mainBundle] bundlePath];\r\n\tpath = [[NSString alloc] initWithString:[pathProgetto stringByAppendingPathComponent:@\"dati.xml\"]];\r\n}\r\n<\/pre>\n<p>Questo metodo viene eseguito all&#8217;avvio della vista e ci permette di definire dei comportamenti che devono essere eseguiti prima di ogni altra cosa. Con le due istruzioni che vedete nelle righe 5 e 6, definiamo il percorso del nostro file &#8220;dati.xml&#8221;: esso viene cercato all&#8217;interno della cartella del nostro progetto. Queste istruzioni sono molto importanti, in quanto non viene definito un percorso assoluto (soluzione sempre sconsigliabile e spesso errata), ma viene definito il percorso effettivo in cui si trova il file.<\/p>\n<p>Dobbiamo ora definire l&#8217;azione che viene eseguita quando premiamo sul pulsante. Ecco il codice da inserire:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n-(IBAction)avviaParsing{\r\n\t\/\/Bisogna convertire il file in una NSURL altrimenti non funziona\r\n\tNSURL *xmlURL = [NSURL fileURLWithPath:path];\r\n\t\/\/ Creiamo il parser\r\n\tNSXMLParser *parser = [[ NSXMLParser alloc] initWithContentsOfURL:xmlURL];\r\n\t\/\/ Il delegato del parser e' la classe stessa (self)\r\n\t[parser setDelegate:self];\r\n\t\/\/Effettuiamo il parser\r\n\tBOOL success = [parser parse];\r\n\t\/\/controlliamo come \u00e8 andata l'operazione\r\n\tif(success == YES){\r\n\t\t\/\/parsing corretto\r\n\t} else {\r\n\t\t\/\/c'\u00e8 stato qualche errore...\r\n\t}\r\n\t\/\/ Rilasciamo l'oggetto NSXMLParser\r\n\t[parser release];\r\n}\r\n<\/pre>\n<p>Le prime due istruzioni (righe 3 e 5) ci permettono di definire il parser, partendo dal percorso del nostro file. Alla riga 9 avviamo il processo di parsing, salvando il risultato in una variabile booleana: se essa vale YES la conversione si \u00e8 conclusa senza errori, altrimenti c&#8217;\u00e8 stato un errore (che potrebbe essere dovuto ad errori nella struttura del file xml oppure ad errori di scrittura del codice).<br \/>\nCome potete vedere non si tratta di codice complesso, sono poche istruzioni che dovrebbero risultarvi chiare.<\/p>\n<p>La parte che viene ora \u00e8 quella che si occupa di leggere i dati dal file xml. Iniziamo inserendo questo metodo:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName\r\n  namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName\r\n\tattributes:(NSDictionary *)attributeDict {\r\n \r\n\tif ([elementName isEqualToString:@\"studenti\"]){\r\n\t\t[textArea setText:[[NSString alloc] initWithFormat:@\"%@\\nInizio studenti\",textArea.text]];\r\n\t\tNSLog(@\"ok\");\r\n\t}\r\n\telse if([elementName isEqualToString:@\"studente\"]){\r\n\t\t[textArea setText:[[NSString alloc] initWithFormat:@\"%@\\nNuovo studente\",textArea.text]];\r\n\t}\r\n\telse if([elementName isEqualToString:@\"matricola\"]) {\r\n\t\t[textArea setText:[[NSString alloc] initWithFormat:@\"%@\\nMatricola: \",textArea.text]];\r\n\t}\r\n\telse if([elementName isEqualToString:@\"cognome\"]) {\r\n\t\t[textArea setText:[[NSString alloc] initWithFormat:@\"%@\\nCognome: \",textArea.text]];\r\n\t}\r\n\telse if([elementName isEqualToString:@\"nome\"]) {\r\n\t\t[textArea setText:[[NSString alloc] initWithFormat:@\"%@\\nNome: \",textArea.text]];\r\n\t}\r\n}\r\n<\/pre>\n<p>Come potete osservare, vi sono una serie di controlli <em>if<\/em>, che vanno a testare l&#8217;elemento corrente, per riconoscerlo e per scrivere una stringa adeguata nella textArea che abbiamo predisposto. Questo processo \u00e8 possibile perch\u00e8 conosciamo a priori la struttura del file xml: questo \u00e8 quasi sempre vero, in quanto sarebbe quasi impossibile leggere un file xml di cui non conosciamo la struttura interna.<br \/>\nIl metodo viene, ovviamente, richiamato ogni volta che il parser incontra un nuovo elemento, cio\u00e8 l&#8217;apertura di un tag.<\/p>\n<p>Per completare il nostro programma mancano solo due metodi:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {\r\n\t[textArea setText:[[NSString alloc] initWithFormat:@\"%@%@\",textArea.text,string]];\r\n}\r\n \r\n- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName\r\n\tnamespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {\r\n\t[textArea setText:[[NSString alloc] initWithFormat:@\"%@\\nFine elemento: %@\",textArea.text,elementName]];\r\n}\r\n<\/pre>\n<p>Il primo viene richiamato quando il parser incontra un valore racchiuso tra due tag (l&#8217;informazione vera e propria). Nel nostro caso ci limitiamo a inserirla nella textArea, per\u00f2 potreste fare delle operazioni pi\u00f9 o meno complesse sulle informazioni che leggete dal file.<br \/>\nL&#8217;ultimo metodo, invece, viene richiamato quando il parser incontra un tag di chiusura. Anche in questo caso l&#8217;unica azione che faremo sar\u00e0 quella di inserire una stringa nella textArea.<\/p>\n<p>Possiamo finalmente cliccare su &#8220;Build and Go!&#8221; e testare la nostra applicazione funzionante!<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/t042_xml_screenshot_09.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/t042_xml_screenshot_09.png\" alt=\"T042 - XML Screenshot 09\" title=\"t042_xml_screenshot_09\" width=\"414\" height=\"770\" class=\"aligncenter size-full wp-image-3414\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/t042_xml_screenshot_09.png 414w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/t042_xml_screenshot_09-161x300.png 161w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/t042_xml_screenshot_09-80x150.png 80w\" sizes=\"auto, (max-width: 414px) 100vw, 414px\" \/><\/a><br \/>\n<\/center><\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/download_icon.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/download_icon.png\" alt=\"Icona Download\" title=\"download_icon\" width=\"33\" height=\"40\" class=\"alignnone size-full wp-image-3385\" \/><\/a> Se avete problemi con il tutorial, questo \u00e8 il <a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/xmltutorial.zip\" target=\"_blank\">nostro file di progetto<\/a>.<br \/>\n<\/center><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Eccoci con un nuovo tutorial dedicato alla programmazione per iPhone. Oggi vedremo come integrare nelle nostre applicazioni&#8230;<\/p>\n","protected":false},"author":254,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[216,223,88,224],"class_list":["post-3404","post","type-post","status-publish","format-standard","hentry","category-tutorial-pratici","tag-andrea-busi","tag-parsing-xml","tag-programmazione-iphone","tag-xml-iphone"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/3404","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/users\/254"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/comments?post=3404"}],"version-history":[{"count":4,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/3404\/revisions"}],"predecessor-version":[{"id":3419,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/3404\/revisions\/3419"}],"wp:attachment":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media?parent=3404"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/categories?post=3404"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/tags?post=3404"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}