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
Ejemplo .FLA, lectura genérica de XML en Flash

gersonm :
Por Karac el 12 de Septiembre de 2006
Por que usar datos_obj.productos.p_0.item_1.__atributos.nombre
Si podemos usar (a modo de ejemplo)
_global.mixml.childNodes[0].childNodes[0].attributes.nombre
También uso mucho esto:
productos = _global.mixml.childNodes[0]
trace (productos.childNodes[0].attributes.nombre)
Asi vamos simplificando las ramas del XML para que no sea tan confuso.
De esta forma también eliminamos la necesidad de que cada hermano se llame distinto.
Por ahí es un poco menos claro al principio, pero no hace falta ningún script y si algo se modifica es muy simple de arreglar.
Ojo, pregunto porque quizás me estoy perdiendo de algo. Saludos!
Karac_blog :
Si podemos usar (a modo de ejemplo)
_global.mixml.childNodes[0].childNodes[0].attributes.nombre
Hola Karac
Muchas gracias por el comentario.
Te doy mi respuesta personal: es mucho más práctico/fácil/entendible/usable/(y menos complicado) el Script para mi, que lidiar con las propiedades del objeto XML, además gracias a mi memoria, cada vez que intentaba procesar un nuevo XML ya había olvidado todo lo que eso significaba y me tocaba comenzar de 0's en cada ocasión, así decidí crear una solución genérica para olvidarme de esos problemas definitivamente.
PD: También tengo lo mismo para C++...por si alguien lo necesita
Por juan manuel huerta el 12 de Septiembre de 2006
Por Rey el 13 de Septiembre de 2006
Me parece muy buena tu idea pero creo que se podría mejorar utilizando búsqueda de grupos de nodos y no llamar los nodos de manera singular, actualmente utilizo una liberia de javascript llamada jquery (http://jquery.com) en la que si deseo llamar un grupo de nodos utilizo algo como :
$(“nombreGrupoNodos”).
Siendo “$” el objeto y lo que esta entre comillas el nombre de los nodos que busco , además tiene funciones de manejo como $(“nd”)each(ejecutarFuncion) la cual ejecuta una función por cada nodo que encuentre.
De todas maneras esto es flash y no javascript pero podría darte ideas, checa el link, quizá te sirva de algo.
Un saludo y gracias por el script
juan manuel huerta_blog :
Hola Juan Manuel
Te puedo enviar el script, pero para que funcione es necesario instalar Libxml2. Además lo hice en DevC++ y no sé qué IDE usas.....tal vez haga un tuto sobre eso.........algún día
Rey_blog :
Me parece muy buena tu idea pero creo que se podría mejorar utilizando búsqueda de grupos de nodos y no llamar los nodos de manera singular, actualmente utilizo una liberia de javascript llamada jquery (http://jquery.com) en la que si deseo llamar un grupo de nodos utilizo algo como :
$(“nombreGrupoNodos”).
Siendo “$” el objeto y lo que esta entre comillas el nombre de los nodos que busco , además tiene funciones de manejo como $(“nd”)each(ejecutarFuncion) la cual ejecuta una función por cada nodo que encuentre.
No conocía esa librería que se ve genial, aunque eso es posible también con XPath. Sin embargo, el script se hizo pensado para aplicaciones ActionScript.
Por raul el 13 de Septiembre de 2006
http://www.xfactorstudio.com/
Código :
class objectXML { private var docXML:Object; //------------------------------------------- function objectXML(queRuta, queXML, queObj) { queRuta[queObj] = new Object(); docXML = new XML(); docXML.ignoreWhite = true; docXML.load(queXML); docXML.onLoad = function() { leerXML(this.firstChild, 0, queRuta[queObj]); function leerXML(rama_xml:XMLNode, nivel:Number, obj:Object) { for (var xml in rama_xml.childNodes) { var nombreNodo_str:String = rama_xml.childNodes[xml].nodeName; if (obj[nombreNodo_str] == undefined) { obj[nombreNodo_str] = new Array(); } if (obj[nombreNodo_str]["__atributos"] == undefined) { obj[nombreNodo_str]["__atributos"] = new Array(); for (var atributos in rama_xml.childNodes[xml].attributes) { 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), obj[nombreNodo_str]); } } } }; } }Para cargar el xml:
Código :
Y el uso seguiría igual:
Código :
Permitiendo cargar varios xml en diferentes objetos:
Código :
Por Miguel Angel el 14 de Septiembre de 2006
http://www.sephiroth.it/file_detail.php?id=134#
Muy bueno para ambos, gran ejemplo.
Por Karac el 14 de Septiembre de 2006
La verdad que está genial, funciona muy bien, y soporta wildcards (comodines).
Recomiendo echarle un vistazo.
Freddie® :
gracias, gracias... me van hacer ruborizar...
Por zenen olivera flores el 27 de Septiembre de 2006
Por Dablak el 08 de Octubre de 2006
<producto>Camiseta</producto>
Al hacer:
trace(datos_obj.producto);
apareceria "Camiseta"?
Por Dan el 12 de Octubre de 2006
Por juan_manuel_h el 13 de Octubre de 2006
Por cesar el 19 de Octubre de 2006
Por Raptor 00 el 03 de Noviembre de 2006
Raptor 00_blog :
http://www.cristalab.com/tutoriales/12/tutorial-de-xml-en-flash
Por Hector el 04 de Noviembre de 2006
Por Hector el 04 de Noviembre de 2006
Por Dragnus el 08 de Noviembre de 2006
Una sugerencia ??
Gracias
Por vanvanero el 27 de Diciembre de 2006
Por pollin el 24 de Enero de 2007
primero necesito y yo he propuesto 2 soluciones.
la primera configurar todo lo de xml en varios archivos xml.
y la segunda es hacer un gran arbol xml en el cual se pueda configurar de todo.
eh aqui el problema.
quiero diseñar una galeria de fotos en flash. ya tengo un documento hecho por algun buen samaritano programador de flash que lo hizo. asi que no se preocupe conservare su nombre en los archivos asi como todo lo que el entrego en el ejemplo.
a lo que voy es que le are cambios vastante drasticos para que se vea mucho mas vistosa la presentacion de las imagenes.
para diseñarlo necesitare leer un xml correctamente.
de tal manera q los campos de cada rama puedan variar. ejemplo.
que el primer nodo tenga los siguientes hijos.
ruta: "image1.jpg"
nombre "imagen 1"
lenght 280
width 280
descripcion "imagen representativa"
y el segundo nodo tubiera la siguente informacion
ruta: "image1.jpg"
lenght 280
width 280
aki le estaria dando la posibilidad a los usuarios de darle forma como deseen a sus imagenes no restringiendolos u obligandolos a llenar todas las propiedades.
el problema no es cargar el xml en si.
la problematica consiste en saver como entender los datos correctamente.
anteriormente les dije que tengo 2 soluciones.
separar todo en diferentes xml y que un xml contenga las direcciones de los otros xml.
asi configurarian los siguientes archivos.
el xml para las imagenes.
el xml para configurar medidas
el xml que se encargaria de llamar a los otros xml.
la otra solucion era que todo estubiera en un solo xml.
"""ahora lo que quiero saver es como en flash saver cuales son las propiedades de cada nodo."""
se que puedo usar un for. pero el problema es que como el numero de las propiedades pueden variar debo saver asta donde leer.
bueno si alguien q sepa mas qu yo me dise me aria un favor.
Por caincrane el 31 de Enero de 2007
Por aquilesco el 01 de Febrero de 2007
Primero decir que no tengo ni mucha idea ni de flash ni de xml, solo a nivel de animaciones sencillas.
pero buscando por el foro he encontrado este tema interesante. Creo que la función es cargar un archivo de xml en flash y poder modificarlo no? y que luego se guarden esas modificaciones. SI no es asi corregirme por favor.
Buen necesito hacer algo parecido con un xml mas sencillo.
Necesito que a traves de un flash o un formulario php insertar lines en un xml.
ejemplo:
Código :
ya que este xml modifica un archivo html. Me gustaría saber si este codigo de aqui me sirve, o donde tengo que buscar para orientarme, o un alma que me de un codigo al menos para empezar.
Espero me haya esplicado bien.
Saludos
Por aquilesco el 02 de Febrero de 2007
http://www.cristalab.com/tutoriales/12/tutorial-de-xml-en-flash
mantener los datos que tiene y poder editarlos y poder añadir mas campos.
Por cellular phone montr el 03 de Abril de 2007
y para cargar imagenes desde un flash via xml como se puede hacer
gracias
Por jose araujo el 07 de Abril de 2007
<?
/*
para hacerlo facil y poder usar el codigo en junto con cualkier script decidi hacer una funcion en donde el unico argumento q se pasa es la ruta de la carpeta donde se va a guardar el archivo, esto me permite poder reutilizar esta funcion para cualkier cosa q kiera subir*/
function cargar($dirname){
if(!empty($_FILES['file']['name'])){
if (is_uploaded_file($_FILES['file']['tmp_name'])) {
move_uploaded_file($_FILES['file']['tmp_name'],$dirname.$_FILES['file']['name']);
}
return $dirname.$_FILES['file']['name'];
}else
return "";
}
//forma de utilizacion
cargar("www.correiros.com/form");
?>
Por matamorfosis el 07 de Junio de 2007
Por javier el 19 de Julio de 2007
tengo un problema al cargar un laodmovie de una galeria el tema es que al cargar el loadmovio que se encuentra en otra carpeta no detacta la galaeria ya que no abre el gallery.xml que action puedo poner en flash para que me cargue el xml
Por Gosunkugi el 05 de Diciembre de 2007
Por XMLParser el 06 de Diciembre de 2007
Por XMLParser el 06 de Diciembre de 2007
queRuta[queObj] = new Object();
saludos yo...
Por Juan el 06 de Diciembre de 2007
Por axesnext el 07 de Febrero de 2008
Por Johny-Fui el 26 de Abril de 2008
Alguien sabe cómo podría añadirle algun listener que detecte cuando se haya argado el archivo?
Si declaro el nuevo objectXML y en la siguiente linea intento hacer un trace me resulta undefined porque aun no carga los datos.
Por Samar el 25 de Agosto de 2008
Por Antoine el 04 de Diciembre de 2008
tengo una pregunta que creo que es sencilla, pero soy novato...
Tengo que crear un flash en el que aparezca un texto que estará a su vez en una url (en mi ftp).
Como programo en flash para que me vaya a buscar el texto de la url www.ejemplo.com/ejemplo??
muchas gracias de antemano por vuestra ayuda
ciao
antoine
Por star725 el 08 de Diciembre de 2008
<?xml version="1.0"?>
<datos>
<edificio nombre="Los Manantiales" pisos="10" sotanos="2" MPER="8" MPESO="800">
<datos tipo="1" edad="30" sexo="1" profesion="2" Contenido="0" piso_destino="3" peso="100" />
<datos tipo="0" edad="0" sexo="0" profesion="0" Contenido="1" piso_destino="4" peso="200" />
</edificio>
</datos>
Por GEDER el 03 de Febrero de 2009
Por illo_guay el 02 de Marzo de 2009
Solo una pregunta: El script funciona en AS3? o hay que cambiar algo? como el _gobal que me da que es de AS2.
Muchas gracias a todos.
Por illo_guay el 02 de Marzo de 2009
for(var n in datos_obj.productos){
if(n != "__atributos"){
trace(datos_obj.productos[n].__atributos.nombre);
}
}
Que es lo de retorna? el nombre de p_0 y p_1 o todos los intermedios tb?? es que no veo muy bien como funciona eso del datos_obj.producto[n]....
Me podriais aclarar eso????
gracias de antemano.
Por Kode el 28 de Abril de 2009
Por Andrés el 05 de Junio de 2009
Pero cómo hago si tengo un xml así, sin atributos???
<datos>
<algo>lero lero</algo>
<cosa>una cosa</cosa>
</datos>
gracias!
Por pedro el 11 de Julio de 2009
Por geova el 18 de Mayo de 2010
Por Pipo el 30 de Agosto de 2010
Ayuda por favor!!! como hago!!!!
Gracias
Por Francico Arreola el 27 de Diciembre de 2010
Por Guido Pozo el 19 de Enero de 2011
Quisiera saber si puedo llamar archivos xml de diferente idioma para que se cargen en una imagen jpg como por ejemplo un mapa y cada vez que se de un clic en idioma los textos se cambien con relación al idioma que se pida