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.
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
¿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.
Por master_of_puppetz el 20 de Septiembre de 2010
Por Andros el 20 de Septiembre de 2010
Es más sencillo e intuitivo.
Por Sisco el 20 de Septiembre de 2010
Por Sebastian el 22 de Septiembre de 2010
Por Otaku RzO el 24 de Septiembre de 2010
XML es muy potente y muy usado. No será el más optimo para pasar un <mensaje>hola mundo</mensaje> a comparación de json {"mensaje":"hola mundo"}, pero su poder radica en los filtros y el orden visual (si tienes que trabajar un XML manualmente).
Buen aporte .
Por rides el 27 de Septiembre de 2010
Por CLAnonimo el 21 de Octubre de 2010
Por bibi el 22 de Junio de 2011
muchas gracas
Por Adrian el 24 de Febrero de 2012
digo que pasa si el xml que recibo tiene errores por ejemplo me olvide de cerrar un tag.
Gracias