Comunidad de diseño web y desarrollo en internet

La clase XML en ActionScript 3

ActionScript 3 trajo consigo muchos cambios, pero quizas uno de los mas importantes es la forma de manejar XML. Claro que mucho de lo que haciamos en AS2 permanece, tambien hay muchas otras cosas que vienen a mejorar la experiencia de lidiar con XML. Esto es gracias a la introducción de E4X (Ecmascript for XML).

Estructura del XML


Para este tutorial usaremos un fichero XML donde guardaremos los datos de 7 clabbers, con su clabLevel y user group:

Código :

<Cristalab>
<Miembro nombre="Zguillez">
<userGroup>BOFH</userGroup>
<clabLevel>5520</clabLevel>
</Miembro>
<Miembro nombre="Hernán">
<userGroup>SWAT</userGroup>
<clabLevel>2415</clabLevel>
</Miembro>
<Miembro nombre="_CONEJO">
<userGroup>GAIA</userGroup>
<clabLevel>7582</clabLevel>
</Miembro>
<Miembro nombre="Ramm">
<userGroup>REC</userGroup>
<clabLevel>2494</clabLevel>
</Miembro>
<Miembro nombre="M@U">
<userGroup>Héroes</userGroup>
<clabLevel>3460</clabLevel>
</Miembro>
<Miembro nombre="penHolder">
<userGroup>Premios Secretos</userGroup>
<clabLevel>2448</clabLevel>
</Miembro>
<Miembro nombre="XKlibur">
<userGroup>Animé Bloggers</userGroup>
<clabLevel>5353</clabLevel>
</Miembro>
</Cristalab>

El XML anterior se puede representar mediante un diagrama de cajas inclusivas, para su mejor comprención como el siguiente:


Como vemos la caja principal llamada Cristalab, es nuestro Node y es como lo vamos a identificar en AS, luego, dentro de Cristalab, estan los Miembros, que son Child Nodes, dentro de la etiqueta esta incluída la información del nombre de cada miembro, esta clase de informacion se llama attribute; por último esta la información acerca del user group al que pertenecen y su clabLevel, que tambien son Child Nodes

Cargar el contenido del XML


Lo primero que necesitamos hacer es crear una instancia de la clase URLLoader que no permitira traer informacion externa, y tambien una instancia de la clase XML:

Código :

var _loader:URLLoader;
var _xml:XML;

Ahora debemos cargar el contenido en nuestro URLLoader; después usaremos uno de los eventos de la clase XML, para saber cuando el contenido ha sido cargado completamente, y asi poder mostrarlo:

Código :

_loader = new URLLoader();
_loader.load(new URLRequest("clabbers.xml"));
_loader.addEventListener(Event.COMPLETE, cargarXML);
//
function cargarXML(e:Event):void
{
_xml = new XML(e.target.data);
trace(_xml);
}

Esto nos mostrara la estructura completa del XML en el panel de salida. Ahora como hacemos para acceder a cada dato en particular. Crearemos otra funcion que nos permitira hacerlo, esta funcion recibira una variable de tipo XML con la trabajaremos para acceder a los datos. Reemplacemos la última funcion por el siguiente código:

Código :

function cargarXML(e:Event):void
{
_xml = new XML(e.target.data);
leerXML(_xml);
}
//
function leerXML(datos:XML):void
{
trace(datos.Miembro);
}

Ahora veremos lo que esta dentro de Cristalab, osea solo los nodos de miembros:

Código :

<Miembro nombre="Zguillez">
<userGroup>BOFH</userGroup>
<clabLevel>5520</clabLevel>
</Miembro>
<Miembro nombre="Hernán">
<userGroup>SWAT</userGroup>
<clabLevel>2415</clabLevel>
</Miembro>
<Miembro nombre="_CONEJO">
<userGroup>GAIA</userGroup>
<clabLevel>7582</clabLevel>
</Miembro>
<Miembro nombre="Ramm">
<userGroup>REC</userGroup>
<clabLevel>2494</clabLevel>
</Miembro>
<Miembro nombre="M@U">
<userGroup>Héroes</userGroup>
<clabLevel>3460</clabLevel>
</Miembro>
<Miembro nombre="penHolder">
<userGroup>Premios Secretos</userGroup>
<clabLevel>2448</clabLevel>
</Miembro>
<Miembro nombre="XKlibur">
<userGroup>Animé Bloggers</userGroup>
<clabLevel>5353</clabLevel>
</Miembro>

De esta forma vamos accediento a los datos, pero claro, no nos interesa mostrar las etiquetas, para eso existe el metodo text(); que nos muestra solo lo que contienen las etiquetas:

Código :

function leerXML(datos:XML):void
{
trace(datos.Miembro.userGroup.text());
}

Ahora veremos algo asi:

Código :

BOFHSWATGAIARECHéroesPremios SecretosAnimé Bloggers

Como los datos son indexados, por el metodo text() podemos acceder a cada dato en particular:

Código :

function leerXML(datos:XML):void
{
trace(datos.Miembro.userGroup.text()[0]);
trace(datos.Miembro.userGroup.text()[2]);
trace(datos.Miembro.userGroup.text()[4]);
}

Código :

BOFH
GAIA
Héroes


Acceder a los datos de un XML de forma indirecta


Para esto vamos a usar un objeto llamado XMLList que no es mas que una lista de objetos de tipo XML, este objeto posee los metodos de un List mas los de un objeto XML. Entonces Guardaremos los datos que nos interesan para despues acceder por medio de algun loop:

Código :

function leerXML(datos:XML):void
{
var clabberList:XMLList = datos.Miembro.userGroup;
//
for (var i:int = 0; i < clabberList.length(); i++) {
//
var userGroup:XML = clabberList[i];
trace(userGroup);
}
}

Código :

BOFH
SWAT
GAIA
REC
Héroes
Premios Secretos
Animé Bloggers

Ahora bien, supongamos que no sabemos o recordamos, los nombres de los nodos que tenemos, entonces debemos cargarlos de forma generica usando children() luego usaremos la propiedad name():

Código :

function leerXML(datos:XML):void
{
var clabberList:XMLList = datos.Miembro.children();
//
for (var i:int = 0; i < clabberList.length(); i++) {
//
var userGroup:XML = clabberList[i];
trace(userGroup.name());
}
}

Código :

userGroup
clabLevel
userGroup
clabLevel
userGroup
clabLevel
userGroup
clabLevel
userGroup
clabLevel
userGroup
clabLevel
userGroup
clabLevel

De esta forma podemos acceder a la informacion mas precisamente:

Código :

function leerXML(datos:XML):void
{
var clabberList:XMLList = datos.Miembro.children();
//
for (var i:int = 0; i < clabberList.length(); i++) {
//
var userGroup:XML = clabberList[i];
//
if (userGroup.name() == "clabLevel") {
//
trace(userGroup);
}
}
}

Código :

5520
2415
7582
2494
3460
2448
5353

De esta misma forma podemos acceder alos atributos, usando attributes() en lugar de children():

Código :

function leerXML(datos:XML):void
{
var clabberList:XMLList = datos.Miembro.attributes();
//
for (var i:int = 0; i < clabberList.length(); i++) {
//
var userGroup:XML = clabberList[i];
trace(userGroup.name());
}
}

Código :

Zguillez
Hernán
_CONEJO
Ramm
M@U
penHolder
XKlibur

incluso podemos ser mas especificos en caso de que tengamos mas de un atributo:

Código :

var clabberList:XMLList = datos.Miembro.attributes("nombre");


Filtrar información del XML


Ahora el filtrado de inforamcion es extremadamente fácil, solo hace falta indicar el nodo y el dato de la siguiente menera:

Código :

function leerXML(datos:XML):void
{
var clabberList:XMLList = datos.Miembro.(clabLevel >= "5000");
trace(clabberList);
}

[xml ]
<Miembro nombre="Zguillez">
<userGroup>BOFH</userGroup>
<clabLevel>5520</clabLevel>
</Miembro>
<Miembro nombre="_CONEJO">
<userGroup>GAIA</userGroup>
<clabLevel>7582</clabLevel>
</Miembro>
<Miembro nombre="XKlibur">
<userGroup>Animé Bloggers</userGroup>
<clabLevel>5353</clabLevel>
</Miembro>
[/xml]
Como podemos ver hemos filtrado a los clabbers con cL mayor a 5000 ^^, entonces queremos solo sus nombres:

Código :

function leerXML(datos:XML):void
{
var clabberList:XMLList = datos.Miembro.(clabLevel >= "5000").attributes();
//
for (var i:int = 0; i < clabberList.length(); i++) {
trace(clabberList[i]);
}
}

Código :

Zguillez
_CONEJO
XKlibur

Ahora, si lo que queremos filtrar son atributos, necesitamos anteponer al signo @ a lo que vamos afiltrar:

Código :

var clabberList:XMLList = datos.Miembro.(@nombre == "Zguillez"); 

De esta forma vemos que el manejo de datos en XML se a vuelto extremadamente intuitivo, haciendo mas legible nuestro codigo.

Nota:
Este es un tutorial que no fue. Esta escrito hace aproximadamente un año, y he dejado los valores de cL como recuerdo de ello, no escribo esto como recriminatorio se que si no se publico es por que no se pudo... pero lo encontre por ahi y lo publique :P

¿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