Comunidad de diseño web y desarrollo en internet online

Script para leer cualquier XML en Flash

Hace algunos meses cuando realizaba mi proyecto de tesis, usé algunos archivos XML como es ya costumbre con casi todo proyecto en Flash que hago.

Hasta acá todo normal, pero resultó que a medida que avanzaba el proyecto me venían más ideas a la cabeza para que la aplicación fuera más atractiva, lo cual terminaba casi siempre en una pequeña modificación en el XML, lo cual implicaba hacer otra pequeña modificación en el Script que lo procesaba....hasta que llegó el momento de no más, de dejar de modificar el Flash cada vez que cambiaba el XML. Fue así como surgió la idea.

No es la gran cosa, pero es algo que me ha ayudado bastante y no creo que use otra cosa para procesar archivos XML en mucho tiempo. Entonces si me ha servido a mi de manera considerable, es posible que haya otra persona a la que también le sirva.

El asunto es bastante simple. Por un lado tenemos un archivo XML que es básicamente un árbol. Por otro lado tenemos una variable tipo Object (larga vida a este elemento ! !) en ActionScript, que para mejor manipulación será mejor definirla como global.

Lo que se hizo fue crear una función recursiva que capture el contenido del XML y lo grabe en nuestra variable tipo Object.

Hecho lo anterior, bastará con acceder a la variable Object desde cualquier punto de la aplicación tal como si esta fuera el archivo XML, es decir, podremos recorrerla en árbol.
Por ejemplo (al fin uno !), tenemos la siguiente definición XML:

Código :

<?xml version="1.0" encoding="iso-8859-1"?>
<datos>
   <productos>
      <p_0 nombre="Esto%20es%20un%20producto" descripcion="producto%20producto%20producto%20producto%20producto%20producto%20">
         <item_0 nombre="Servicios%20generales" img="img/sp_1.png" >
            <referencia_0 nombre="1-18" descripcion="d118-d118-d118-d118-d118" material="0-1-4-6" color="1-3-5-7" tallas="1-2-3" fotos="r0_peq.jpg*r0.jpg" />
            <referencia_1 nombre="1-19" descripcion="d119-d119-d119-d119-d119" material="0-1-4-6" color="1-3-5-7" tallas="1-2-3" fotos="r0_peq.jpg*r0.jpg" />
            <referencia_2 nombre="1-20" descripcion="d120-d120-d120-d120-d120" material="0-1-4-6" color="1-3-5-7" tallas="1-2-3" fotos="r0_peq.jpg*r0.jpg" />
         </item_0>
         <item_1 nombre="Peces%raros" img="img/sp_0.png" >
            <referencia_0 nombre="1-18" descripcion="d118-d118-d118-d118-d118" material="0-1-4-6" color="1-3-5-7" tallas="1-2-3" fotos="r0_peq.jpg*r0.jpg" />
         </item_1>
      </p_0>
      <p_1 nombre="Esto%20es%20otro%20producto" descripcion="Manteles,%20Carpetas,%20Servilletas,%20toallas%20cortes%C3%ADa,%20individuales,%20portavasos,%20cojines,%20vaminos,%20cubrecamas,%20tapetes%20en%20lino%20y%20telar." >
      </p_1>
   </productos>
   <idioma nombre="es">
      <detalles_subproducto ref="Referencia" />
   </idioma>
</datos>

A través de nuestra variable Object llamada datos_obj, podremos desde cualquier parte de la aplicación referirnos de la siguiente manera para capturar por ejemplo el atributo nombre del nodo item_1:

Código :

datos_obj.productos.p_0.item_1.__atributos.nombre

Fácil, no ? ^^
Ahora, si por ejemplo queremos saber los valores del atributo nombre en la rama productos, haremos lo siguiente:

Código :

      for(var n in datos_obj.productos){
         if(n != "__atributos"){
            trace(datos_obj.productos[n].__atributos.nombre);
         }
      }

Bien, entonces acá habrá que aclarar creo las únicas dos restricciones:
    Nodos hermanos no podrán compartir el nombre

    Ningún nodo o atributos dentro del XML podrá llamarse __atributos, ya que através de esta cadena se recogen los atributos de cada nodo

No es más, espero le sirva a alguien.
Ah sí, olvidaba el Script:

Código :

var imagenes_xml = new XML();
imagenes_xml.ignoreWhite = true;
imagenes_xml.onLoad = function(){
    function leerXML(rama_xml:XMLNode, nivel:Number, datos_obj:Object){
        for(var xml in rama_xml.childNodes){
            var nombreNodo_str = rama_xml.childNodes[xml].nodeName;
            if(datos_obj[nombreNodo_str] == undefined){
                datos_obj[nombreNodo_str] = new Array();
            }
            if(datos_obj[nombreNodo_str]["__atributos"] == undefined){
                datos_obj[nombreNodo_str]["__atributos"] = new Array();
                for(var atributos in rama_xml.childNodes[xml].attributes){
                    datos_obj[nombreNodo_str]["__atributos"][atributos] = unescape(rama_xml.childNodes[xml].attributes[atributos]);
                }
            }
            if(rama_xml.childNodes[xml].hasChildNodes()){
                leerXML(rama_xml.childNodes[xml], (nivel + 1), datos_obj[nombreNodo_str]);
            }
        }
    }
   
   if(this.loaded){
      leerXML(this.firstChild, 0, datos_obj);
      //listo, se cargó, ahora hacemos lo que hay que hacer luego de cargado ^^
      //trace(datos_obj.productos.p_0.item_1.__atributos.nombre);
      for(var n in datos_obj.productos){
         if(n != "__atributos"){
            trace(datos_obj.productos[n].__atributos.nombre);
         }
      }
      play();
   }else{
       trace("no cargó");
   }
}
_global.datos_obj = new Object();
imagenes_xml.load("datos.xml");

Noten que luego de la carga estan escritos los dos ejemplos mostrados, además también noten que he usado unescape para decodificar los datos que vienen en el XML, esto para no tener problemas con caracteres especiales. Lo anterior quiere decir que preferiblemente los valores del XML deberán estar codificados tal y como se codifican los caracteres en las barras de dirección de cualquier navegador, en donde por ejemplo, el espacio en blanco equivale a %20, la á (a minúsucla con acento) a %C3%A1.

Creo que no es más, espero que le sirva a alguien :D .

Ejemplo .FLA, lectura genérica de XML en Flash

¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.

Publica tu comentario

o puedes...

¿Estás registrado en Cristalab y quieres
publicar tu URL y avatar?

¿No estás registrado aún pero quieres hacerlo antes de publicar tu comentario?

Registrate