May 28, 2007

Loading data in Flash from an external XML

Notice: Article only available in Spanish!

Cuando trabajamos con aplicaciones en flash y queremos que conecten con bases de datos para mostrar catálogos de productos, noticias, etc., la mejor forma de hacerlo es mediante el paso de mensajes en formato XML. Leemos de servicios web correctamente formateados en XML, y después mostraremos los datos según nos convenga en la aplicación flash.

Partimos de un archivo XML correctamente formateado, bien estático y alojado en cualquier carpeta del servidor, bien una url a una pasarela php que previamente lea los datos de una base de datos y después los muestre en XML. Vamos a necesitar tres cosas: un objeto LoadVars, un objeto XML y conocer la estructura de los nodos XMLpara poderlos recorrer correctamente.

LoadVars se usará para enviar una petición http a la url de la pasarela, y XML para recoger los datos que devolverá la petición LoadVars. En nuestro caso, partiendo de la estructura XML mencionada en la publicación arriba enlazada, recorreremos cada nodo (childnode), rescatando sus atributos id, name y special_powers.

El código quedará tal que así­:

/* script to manage data in flash, retrieved from a XML backend
 * @author Jorge Albaladejo Pomares [correo@jorgealbaladejo.com]
 * @license Creative Commons License http://creativecommons.org/licenses/by-sa/3.0/
 */

// variables
loadvars = new LoadVars();
readvars = new XML();
urlxml = "http://localhost/test.php"

// define data matrixes
readvars.ignoreWhite = true;
ids = Array();
names = Array();
special_powers = Array();

// execute request and stop main movie execution
loadvars.sendAndLoad(urlxml, readvars, "GET");
_root.stop();
//

//method to be called once data are loaded
readvars.onLoad = function(success) 
{
  trace ("read correctly");
  if (success) 
  {
    long = readvars.firstChild.childNodes.length;
    trace(long);
    
    //Fill array with attributes from each node
    for (i=0; i<long; i++)
    {
      ids[i] = readvars.firstChild.childNodes[i].attributes.id;
      names[i] = readvars.firstChild.childNodes[i].attributes.name;
      special_powers[i] = readvars.firstChild.childNodes[i].attributes.special_powers;
      trace(ids[i] + ' : ' + names[i] + ', ' + special_powers[i]); //debug
    }
  } 
  else 
  {
    trace("Could not load XML with data!");
  }
}; //onload end of method