Cerca con Google

Translate

18 luglio 2011

Tutorial 20 - Importazione dati da XML (Avanzato) tag ripetuti


Nel tutorial di oggi andremo ad approfondire quanto visto nel Tutorial 17 per quanto riguarda l'estrazione dei dati da una pagina in XML.

Non sempre i tag ( gli elementi della pagina XML delimitati dai simboli < e /> ) appaiono una sola volta nella nostra pagina, anzi succede più spesso l'opposto.
Con la procedura vista l'altra volta era possibile estrarre solamente la prima occorrenza del tag cercato.

Vedremo invece oggi come sia possibile utilizzando un'altra procedura creata ad hoc, estrarre il numero "n" (ennesimo...) del tag voluto e poi riutilizzare la procedura che già avevamo creato in precedenza per estrarre il valore del tag desiderato.

Ovviamente riprenderemo dall'app creata nel Tutorial 17, se non l'avete ancora importata nei vostri progetti, quindi fatelo prima di vedere questo filmato.

Guardiamo prima l'esempio di XML qui sotto:

<xml_api_reply version="1">
<weather module_id="0" tab_id="0" mobile_row="0" mobile_zipped="1" row="0" section="0">
<forecast_information>
<city data="Rome, Lazio"/>
<postal_code data="roma"/>
<latitude_e6 data=""/>
<longitude_e6 data=""/>
<forecast_date data="2011-07-15"/>
<current_date_time data="2011-07-15 09:45:00 +0000"/>
<unit_system data="SI"/>
</forecast_information>
<current_conditions>
<condition data="Parzialmente nuvoloso"/>
<temp_f data="79"/>
<temp_c data="26"/>
<humidity data="Umidità: 51%"/>
<icon data="/ig/images/weather/partly_cloudy.gif"/>
<wind_condition data="Vento: S a 23 km/h"/>
</current_conditions>
<forecast_conditions>
<day_of_week data="ven"/>
<low data="22"/>
<high data="31"/>
<icon data="/ig/images/weather/sunny.gif"/>
<condition data="Chiaro"/>
</forecast_conditions>
<forecast_conditions>
<day_of_week data="sab"/>
<low data="22"/>
<high data="33"/>
<icon data="/ig/images/weather/sunny.gif"/>
<condition data="Chiaro"/>
</forecast_conditions>
</weather>
</xml_api_reply>

La volta scorsa, con la procedura da noi creata "XML_Extract" estraevamo il tag racchiuso tra le parentesi < e /> (la parte in rosso nell'esempio di qui sopra)
Con la nuova procedura "XML_Extract_node" invece andremo ad estrarre il tag radice (non son sicuro si dica così nel gergo tecnico XML) contrassegnato dalle parentesi <nometag> e </nometag> (nell'esempio, le parti in blu), questa procedura accetta anche un'ulteriore variabile "element_number" che ci permette di estrarre il tag numero "element_number" dal file XML nel caso ci sia più di un occorrenza dello stesso tag.
A questo punto sarà possibile avere a disposizione per il "parsing" una sottosezione del file XML (nell'esempio che sto per fare, la parte in corsivo) originario a cui applicare la nostra "vecchia" "XML_Extract" che ci permetterà quindi di estrarre il valore voluto dall'elemento radice appena identificato.

Un esempio pratico; vogliamo estrarre la parte in arancione dell'esempio (sab)
Prima richiamerò la procedura "XML_Extract_node" a cui darò come parametri:
- il file XML completo
- il tag "forecast_conditions" 
- il valore 2 (perchè voglio estrarre la seconda ripetizione di questo tag)
Dopodichè richiamerò la procedura "XML_Extract" a cui darò come parametri:
- il file XML appena filtrato dalla procedura "XML_Extract_node"
- il tag "<day_of_week data="
Finalmente avrò il risultato voluto, ovvero il valore "sab"

Uhm...vi sembra troppo complicato...si, anche a me lo sembra, ma spero che rileggendo tutto quanto sopra e vedendo il video le idee vi si schiariscano...

Buona visione!!!


Parte 2:

Come sempre trovate il sorgente dell'app qui

15 commenti:

  1. salve faccio i miei complimenti per i tutorial fatti molto bene e sopratutto chiari e semplici.
    volevo chiederti ma se io avessi una stringa in json del tipo :

    {"memFree":null,"shortVersion":"5.3.2","freq":null,"signal":null,"mcStatus":"3","hostname":"Pinco.Pallino","wlanUptime":null,"ipaddr":"10.4.55.249"},{"memFree":null,"shortVersion":"5.3.2","freq":null,"signal":null,"mcStatus":"3","hostname":"Pippo.franco","wlanUptime":null,"ipaddr":"10.4.55.98"},

    Se volessi creare una tabella dove in ogni riga venissero inseriti i seguenti dati ricevuti dalla stringa, come potrei fare?
    c'è un modo secondo te per dividere questo risultato?
    grazie

    RispondiElimina
  2. Ciao e complimenti per i tutorial.
    L'applicazione fatta da me e testata sull'emulatore mi da il seguente errore:
    "Select list item: Attempt to get item number 2 of a list of length1:(200)"
    Mi sapresti aiutare?
    Grazie.

    RispondiElimina
  3. Dovrebbe voler dire che la lista è vuota (non è quindi probabilmente stata caricata correttamente) prova a debuggare l'elemento web per capire la stringa che ti ritorna, è probabile che ci sia un problema nell'indirizzo html o qualcosa di simile.Se hai ancora problemi se vuoi mandami il sorgente alla mia mail e provo a darci un occhio.

    RispondiElimina
  4. ..anche a me da lo stesso errore..quando clicco sul GPS mi vede la posizione correttamente (tutorial precedente) ma quando clicco sul meteo mi da quell'errore..why???

    RispondiElimina
  5. Ho notato che il collegamento per il download del sorgente non è quello di questo tutorial. Potresti sistemarlo? Grazie in anticipo.

    RispondiElimina
    Risposte
    1. grazie Andrea! ho sistemato! purtroppo però mi sa che le API per accedere a Google Weather non sono più attive... :(
      comunque puoi usare lo stesso procedimento per prendere dati in xml da altre sorgenti

      Elimina
  6. Complimenti per gli utilissimi tutorial.
    Ho un problema e non riesco a trovarne riscontro sul web
    Leggo i contenuti di una rss e li metto in una label. Se tra i contenuti ci sono dei link o dei tag html come b strong href p ecc... come faccio a visualizzarli correttamente nella label?
    Grazie in anticipo
    Walter

    RispondiElimina
    Risposte
    1. purtroppo devi gestirteli te a mano, nel senso che li puoi rimuovere oppure gestire in altra maniera (tipo un link passarlo ad un'altra label), non ci sono componenti che facciano il parsing in automatico di tutto quello che ci può essere nei tag html

      Elimina
  7. ciao sebastino come mi dicesti tu di provare l'applicazione funziona bene cambiando le api con quelle di yahoo wether!!! solo che volevo farti una domanda...c'è un modo per visualizzare le previsioni di oggi,domani e dopodomani contemporaneamente? forse si dovrebbe eliminare il listpicker...ci ho provato ma senza risultato!
    grazie in anticipo.

    RispondiElimina
    Risposte
    1. beh, se nel tuo xml hai anche le previsioni di oggi domani e dopodomani si tratta solo di cambiare il codice che fa il parsing dell xml per estrarre anche quei tag con quei dati, analizza bene l'xml e vedi cosa puoi fare e come estrarre i dati che ti interessano

      Elimina
  8. quindi bisognerebbe lavorare all'interno della procedura "XML_Extract_node" ?

    RispondiElimina
    Risposte
    1. secondo me XML_Extract_node va bene così com'è ma la devi richiamare per estrarre le previsioni del giorno corrente e dei prossimi giorni, quindi può essere che la devi richiamare anche varie volte passando di volta in volta dei parametri diversi

      ad ogni chiamata della procedura XML_Extract_node salvi il risultato in una variabile o una label diversa, alla fine di tutte le chiamate visualizzi tutte i risulati in una o più label
      spero ora le cose siano più chiare

      Elimina
  9. Questo commento è stato eliminato dall'autore.

    RispondiElimina
  10. come mi hai cadere un APK? come importare dati da pagine XML

    RispondiElimina