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:
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 .
Olvidé algo que me parece importante aclarar: Soy conciente de que se puede mejorar, agregarle por ejemplo el detalle de almacenar el nombre de cada nodo y quién sabe que otr acosa, pero así tal cual lo muestro lo he usado con éxito en cada oportunidad
Justo estaba haciendo un script igual a ese. Me has ahorrado mucho trabajo Gracias. Por:Zah
Desde ya muchas gracias por la info, pregunta:
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! Por:Karac_blog
Karac_blog :
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
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:gersonm
me parece buena tu idea, me pasas tu ejemplo en C porfa, tango_taz@yahoo.com, gracias Por:juan manuel huerta_blog
Hola gersonm,
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 Por:Rey_blog
juan manuel huerta_blog :
me parece buena tu idea, me pasas tu ejemplo en C porfa, tango_taz@yahoo.com, gracias
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 :
Hola gersonm, 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:gersonm
yo uso la libreria Xpath y me ha funcionado muy bien http://www.xfactorstudio.com/ Por:raul_blog
Hola. Puestos a mejorar tu código, yo lo metería dentro de una clase:
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 :
var carga:objectXML = new objectXML(this, "xml.xml", "datos_obj");
La verdad que está genial, funciona muy bien, y soporta wildcards (comodines). Recomiendo echarle un vistazo. Por:Karac_blog
Freddie® :
aah, ese zguillez nunca decepciona
gracias, gracias... me van hacer ruborizar... Por:Zguillez
No sé qué tal les va a sentar, después de tan buen trabajo, que les diga que hace poco descubrí que todo eso ya lo trae hecho el componente XMLConnector.... Por:Zah
hola amigo gersonm no tengo nada que preguntar pero me gustaria aprender flash no se si me podrias pasar un tutorial para empezar tengo el programa pero no se donde introducir el codigo espero no te suene incoherente mi comentario, ya que voy para diseño grafico y me gustaria animar gracias. Por:zenen olivera flores _blo
Este metodo funcionaria en el caso de que el XML tubiera un campo asi?
<producto>Camiseta</producto>
Al hacer:
trace(datos_obj.producto);
apareceria "Camiseta"? Por:Dablak_blog
Pues parece ser que no.A ver si alguien se alguien anima hacerle las modificaciones para que se pueda. Yo estoy en ello y de momento nada Por:Dan_blog
al amigo que apenas empieza a meterse a flash, le recomiendo la seccion de tutoriales y tambien que le eche un vistaso a la pagina www.htmlpoint.com esta buena para empezar. Por:juan_manuel_huerta
bueno caballeros yo soy nuevo en esto y no entendi mucho estoy en la´pagina porque guarde unas canciones en un archivo creo xml y no puedo reproducirlos de nuevo como le hago Por:cesar_blog
eso esta bien para los que tengan conocimiento avanzado sobre el tema, pero para novatos está muy complicado Por:Raptor 00_blog
Raptor 00_blog :
eso esta bien para los que tengan conocimiento avanzado sobre el tema, pero para novatos está muy complicado
Entonces empieza a estudiar de las bases de XML: http://www.cristalab.com/tutoriales/12/tutorial-de-xml-en-flash Por:Freddie
Hola nuevos amigos, necesitaria si alguien me puede pasar esto en un archivo fla y el xml asi lo veo funcionando, pq recien acabo de comenzar con Flash y AS, y por lo poco q entiendo esto esta muy BUENO!!!, asi que si pueden subanlo y dejen un link, si se puede, gracias saludos Por:Hector_blog
A perdon pero vale aclarar que ya lei el tutorial que paso Freddie® Gracias nuevamente Por:Hector_blog
Hola amigos, tengo un script q me lee un xml desde una url diferente a dodonde tengo alojado el swf. al colocar ese swf en web ya no me carga la informacion del xml ??
Una sugerencia ?? Gracias Por:Dragnus_blog
vaaaaaa prefiero llamarlo desde php y que ahi me lo reconozca como un XML con los XPath de PHP 5 o el Dom se puede hacer soluciones de lujo y despues si quieren persistir en un interface flash pues es solo cargarlada con un loadVars y ¡Listo! pa' que se engorra uno haciendo tanta clase cuando atravez de la P.O.C(Programación Orientada a la Conectividad) se puede ahorrar tanto paso Por:vanvanero_blog
oe lo qu aki va la problematica.
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.
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:pollin_blog
funciona tambien para xmls k esten en otro dominio? Por:caincrane
Hola buenas a todos. 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 :
<calendario>
<cita fecha="17-2-2007" titulo="Ocupado" descripcion="reserva de unos de estella" />
</calendario>
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
En definitiva lo que quiero conseguir es cargar un xml, como en el tutorial: 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:aquilesco
una pregunta_: y para cargar imagenes desde un flash via xml como se puede hacer
gracias Por:cellular phone montreal_b
buenas tardes, agradeceria enormemente a alguien que me prestara una ayuda con un scrip. para carga de archivos, la idea es que me puedan enrviar archivos atraves de mi pagina, este es el scrip que tengo
<? /* 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:jose araujo_blog
Antes que todo gracias por sus aportes son realmente buenos. Yo solo quisiera saber si es posible cargar el XML pero no desde el archivo, mas bien, desde una variable que contenga toda la informacion del XML. Gracias nuevamente, espero ouedan responder. Por:matamorfosis_blog
yo soy usuario basico de flash 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:javier_blog
Señor... que buen tutorial... todavia me falta mucho por entender a cavalidad pero me estoy esforzando mucho por entender cada parte y le cuento que me ha servido mucho! no es que deme su cuenta en paypal! (ok eso no es cierto) se le agradece! Por:Gosunkugi_blog
pongan un ejemplo de como funciona el ejmplo anterior del parseo generico de XML Por:XMLParser_blog
pues no comprendo la linea queRuta[queObj] = new Object(); saludos yo... Por:XMLParser_blog
Zguillez si puedes pon un ejemplo de como usar tu clase.... Por:Juan_blog
Exelente zguillez es muy practico tu ejemplo pero por algun motivo no recorreo todo el arbol, lo analice y es pq la variable no reconoce todos los nodos de una rama, crees q sea pq uso actionscript 2.0 y no el 3.0 pq no veo otra razon Por:axesnext_blog
Me funciona perfecto! Muchas gracias a gersonm y Zguillez.
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:Johny-Fui
Es bastante buenazo estos apuntes, gracias amigos esta bien detallado, haber si hacen algun comentario sobre como Adjuntar un archivo por formulario flash con xml Por:Samar-blog
Hola a todos.
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:Antoine-blog
hola amigos e tratado de usar el codigo pa leer un xml de esta forma y pues creo q nome sirve al 100%, haces cosas mal y no se como solucionarlas, no se si este usandomal el codigo de esta forma es lo q trato de leer
NO ENTIENDO SOY NOVATO ES ESTO ABUUUU Por:GEDER-blog
Chicos!!! esto es lo que estaba yo buscando....Que razon tenias al decir que alguien que este haciendo proyecto en flash podria necesitarlo....wooowwwww. Justo!!
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
Ammm. Chicos! una cosa mas! Solo hay un detalle que no entiendo. Cuando pones el ejemplo
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:illo_guay
a mi tambien si intento acceder fuera del onLoad me da undefined. ¿Como se usa desde otro clip por ejemplo? Solo me funciona con el ejemplo tal cual esta. Por:Kode-blog
Hola! está muy bueno el script!
Pero cómo hago si tengo un xml así, sin atributos???
<datos>
<algo>lero lero</algo>
<cosa>una cosa</cosa>
</datos>