Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Funzione estrapola dati

Creare una funzione che cattura solo i dati che servono.
Creare una funzione che cattura solo i dati che servono.
Link copiato negli appunti

Cerchiamo adesso di creare una funzione che sia in grado di recuperare i dati dal documento XML indipendentemente dagli spazi bianchi presenti tra i vari TAG del documento XML.

Per questo esempio facciamo una copia del file statico orari.xml e chiamiamo questo file orari2.xml. Inseriamo diversi spazi bianchi tra i vari nodi XML. Se ora guardiamo questo file XML con Internet Explorer (o un'altro browser che supporta l'XML) vediamo che il documento XML viene visualizzato correttamente nella sua struttura ad albero. Se però usiamo il codice Action Script visto negli esempi precedenti ci accorgeremo che il risultato in Output non è corretto!

Dobbiamo quindi creare una funzione su Flash capace di muoversi attraverso i nodi del documento XML analizzando i nomi dei TAG per poter riuscire a recuperare solo i dati che ci servono. Questi dati verranno inseriti in degli array in modo da poter essere manipolati dopo con più facilità.

Codice Action Script (es6.fla)

filexml = "orari2.xml";
ApriXML();
      function ApriXML () {
 mioxml = new XML();
 myarray = new Array();
 myarray2 = new Array();
 myarray3 = new Array();
 idvolo = new Array();
 hpartenza = new Array();
 harrivo = new Array();
 partenza = new Array();
 arrivo = new Array();
 mioxml.load(filexml);
 mioxml.onLoad = ElaboraXML;
      function ElaboraXML (success) {
        if (mioxml.loaded) {
   myarray = mioxml.childNodes;

      for (j=0;j<=myarray.length;j++){
         if (myarray[j].nodeName == "voli"){
   myarray2 = myarray[j].childNodes;
      for (i=0;i<=myarray2.length;i++){
         if (myarray2[i].nodeName == "volo"){
       _root.idvolo.push(myarray2[i].attributes.id);
   myarray3 = myarray2[i].childNodes;
      for (k=0;k<=myarray3.length;k++){
         if (myarray3[k].nodeName == "partenza"){
       _root.partenza.push(myarray3[k].childNodes.toString());
       _root.hpartenza.push(myarray3[k].attributes.h);
               }
         if (myarray3[k].nodeName == "arrivo"){
       _root.arrivo.push(myarray3[k].childNodes.toString());
       _root.harrivo.push(myarray3[k].attributes.h);
               }
            }
           }
            }
           }
            }
  };
     delete myarray;
     delete myarray2;
     delete myarray3;
     delete mioxml;
 };
};

Mandiamo in esecuzione il filmato Flash. Questa volta non ho utilizzato la funzione trace per portare in Output dei dati, ma voglio che attiviate il Debug e andiate a vedere il Debugger del filmato come abbiamo fatto nell'esempio precedente. Il risultato non si vede ma c'è, ed è proprio quello che ci serve!!! 

Come potete osservare abbiamo degli array dove abbiamo inserito tutti i dati prelevati dall'XML. 

Cerchiamo di analizzare il codice Action Script per capire come funziona, in particolar modo vediamo quello che fa la funzione ElaboraXML che è il cuore della nostra applicazione Flash.

Prima di tutto assegnamo all'array "myarray" la matrice dei nodi secondari del documento XML.

myarray = mioxml.childNodes; 

childNodes = restituisce una matrice dei nodi secondari dell'oggetto XML specificato. Ogni elemento nella matrice è un riferimento a un oggetto XML rappresentante un nodo secondario (Dizionario di Action Script).

A questo punto quindi abbiamo nell'array "myarray" diversi elementi costituiti ciascuno da un oggetto XML (in realtà se andiamo a vedere tutti gli elementi tranne uno sono vuoti). Attraverso un ciclo for controlliamo gli elementi di "myarray" per trovare quello il cui nodeName (ovvero il valore del TAG) sia uguale a "voli".

Trovato questo abbiamo identificato il sotto-albero che contiene tutti i nodi "volo", lo prendiamo e associamo la matrice dei nodi secondari di questo elemento ad un altro array chiamato "myarray2" (myarray2 = myarray[j].childNodes;).

A questo punto "myarray2" conterrà diversi elementi ciascuno dei quali è un oggetto XML. Vale lo stesso discorso fatto per "myarray": alcuni elementi saranno vuoti (i famosi spazi bianchi) mentre gli altri contengono i vari nodi "volo" del documento XML. Quindi applichiamo un ciclo for e controlliamo quando il nodeName dell'elemento sia uguale a "volo". 

Quando è uguale a volo preleviamo il valore dell'ID del volo e lo mettiamo in un array (_root.idvolo.push(myarray2[i].attributes.id);) quindi utilizziamo un terzo array "myarray3" per metterci i nodi secondari utilizzando sempre la proprietà childNodes (myarray3 = myarray2[i].childNodes;).

Eseguiamo infine un ciclo for sull'array "myarray3" e prendiamo i dati dagli elementi i cui nodeName siano uguali a "partenza" o "arrivo" e mettiamo questi dati all'interno dei rispettivi array.

   if (myarray3[k].nodeName == "partenza"){
     _root.partenza.push(myarray3[k].childNodes.toString());
     _root.hpartenza.push(myarray3[k].attributes.h);

               }
   if (myarray3[k].nodeName == "arrivo"){
     _root.arrivo.push(myarray3[k].childNodes.toString());
     _root.harrivo.push(myarray3[k].attributes.h);

Liberiamo infine le risorse eliminando gli oggetti che non servono più che altrimenti occuperebbero preziosa memoria della nostra CPU! (è sempre bene per lo meno eliminare quelli più pesanti) 

delete myarray;
delete myarray2;
delete myarray3;
delete mioxml;

Abbiamo realizzato la nostra prima applicazione Flash-XML!

Se adesso aprite l'XML e ad esempio eliminate il primo TAG che corrisponde alla dichiarazione della versione vedrete che il filmato continua a funzionare e i dati dell'XML vengono presi correttamente.

Ti consigliamo anche