Comunidad de diseño web y desarrollo en internet online

Problema XML

Citar            
MensajeEscrito el 03 Oct 2008 09:39 am
La primera vez que toco XML y claro algunos problemas tengo.

Este es el código que uso (visto en post anterior del foro), para cargar el XML:

Código :

Código ActionScript :

//---Declaración de variables  
var thumbXML:XML = new XML();  
var nodos:Array;  
  
thumbXML.ignoreWhite = true;  
  
//---Cuando se cargue el XML  
thumbXML.onLoad = function(success:Boolean):Void  {  
  
   if (success) {  
      nodos = this.firstChild.childNodes;  
      var total:Number = nodos.length;  
      for (var i:Number = 0; i < total; i++) { 
         attachMovie("thumb","thumb"+i,i); 
         this["thumb"+i]._x = 255*i; 
         this["thumb"+i]._y = 0; 
         this["thumb"+i].tithumb = nodos[i].attributes.titulo_xml;  
         this["thumb"+i].categoria = nodos[i].attributes.categoria_xml; 
         this["thumb"+i].fecha = nodos[i].attributes.fecha_xml; 
         this["thumb"+i].cargaImg = nodos[i].attributes.thumbnail_xml; 
         this["thumb"+i].btn.i = i; 
         this["thumb"+i].btn.onRelease = function():Void{  
            _root.cerrarcontenido("visor.swf", _root.cont); 
            _root.tithumb = "Título"+this.i; 
            _root.categoria = "Categoria"; 
            _root.fecha = "2008"; 
            _root.cargaImg = "work/work01/img1.png"; 
            _root.desc = "Prueba de descripción"; 
         }  
      } 
   } else {  
      trace("Error al cargar XML");  
   }  
};  
  
thumbXML.load("works.xml"); 




Y este es mi archivo works.xml:

Código :

Código XML :

<?xml version="1.0" encoding="utf-8"?> 
<images>  
   <pic titulo_xml="Titulo 01" categoria_xml="Web" fecha_xml="2008" thumbnail_xml="work/work01/thumb.png"> 
   <pic titulo_xml="Titulo 02" categoria_xml="Web" fecha_xml="2008" thumbnail_xml="work/work02/thumb.png"> 
   <pic titulo_xml="Titulo 03" categoria_xml="Web" fecha_xml="2008" thumbnail_xml="work/work03/thumb.png"> 
   <pic titulo_xml="Titulo 04" categoria_xml="Web" fecha_xml="2008" thumbnail_xml="work/work04/thumb.png"> 
</images>  




Error de script no me sale. Cuando pruebo la pelicula el bucle me añade el prime thumb vacio y ya esta, ni 3 ni 4, un solo thumb vacio (con sus campos en Undefined).

Pequeña nota, antes tenía el código en un bucle normal con las variables sin nodos asignado, y el bucle funcionaba.

Por mrxispas

36 de clabLevel



 

firefox
Citar            
MensajeEscrito el 03 Oct 2008 09:13 pm
Cuando te refieres a:

Código ActionScript :

this["thumb"+i]._y = 0;


con this te refieres al XML y dentro de este no es que estás creando los objetos. Mejor mira este post, exactamente el mensaje que te abrirá.

Por elchininet

Claber

3921 de clabLevel

17 tutoriales

Genero:Masculino  

Front-end developer at Booking.com

firefox
Citar            
MensajeEscrito el 04 Oct 2008 12:46 pm
Funciona! Muy instructivo el post que me haz dejado. Muchas gracias elchininet.

Dejo el código final por si interesa:

Código ActionScript :

//---Declaración de variables
var myRoot = this;   
var thumbXML:XML = new XML();   
var nodos:Array;   
   
thumbXML.ignoreWhite = true;   
   
//---Cuando se cargue el XML   
thumbXML.onLoad = function(success:Boolean):Void  {   
   
   if (success) {   
      nodos = this.firstChild.childNodes;   
      var total:Number = nodos.length;   
      for (var i:Number = 0; i < total; i++) {  
            attachMovie("thumb","thumb"+i,i);  
       myRoot["thumb"+i]._x = 255*i;
       myRoot["thumb"+i]._y = 0;
       myRoot["thumb"+i].tithumb = nodos[i].attributes.titulo_xml; 
       myRoot["thumb"+i].categoria = nodos[i].attributes.categoria_xml;
       myRoot["thumb"+i].fecha = nodos[i].attributes.fecha_xml;
       myRoot["thumb"+i].cargaImg = nodos[i].attributes.thumbnail_xml;
       myRoot["thumb"+i].btn.i = i;
       myRoot["thumb"+i].btn.onRelease = function():Void{ 
            _root.cerrarcontenido("visor.swf", _root.cont);  
            _root.tithumb = "Título"+this.i;  
            _root.categoria = "Categoria";  
            _root.fecha = "2008";  
            _root.cargaImg = "work/work01/img1.png";  
            _root.desc = "Prueba de descripción";  
         }   
      }  
   } else {   
      trace("Error al cargar XML");   
   }   
};   
   
thumbXML.load("works.xml"); 


El xml es el mismo.

Por mrxispas

36 de clabLevel



 

firefox
Citar            
MensajeEscrito el 04 Oct 2008 06:48 pm
Si vas a utilizar una variable para referirte a la raiz elimina todos los "_root" de la misma manera que hiciste con los thumbs:

Código ActionScript :

myRoot.cerrarcontenido("visor.swf", myRoot.cont);   
myRoot.tithumb = "Título"+this.i;   
myRoot.categoria = "Categoria";   
myRoot.fecha = "2008";   
myRoot.cargaImg = "work/work01/img1.png";   
myRoot.desc = "Prueba de descripción";  

Por elchininet

Claber

3921 de clabLevel

17 tutoriales

Genero:Masculino  

Front-end developer at Booking.com

firefox
Citar            
MensajeEscrito el 16 Oct 2008 11:27 am
Vuelvo a usar este hilo porque tiene que ver con una duda sobre XML.

Me gustaría saber si es posible cargar un XML con la siguiente estructura:

Código XML :

<?xml version="1.0" encoding="utf-8"?>  
<images>   
   <pic titulo_xml="Titulo 01" categoria_xml="Categoría 1" fecha_xml="2008" thumbnail_xml="work/work01/thumb.png">  
   <pic titulo_xml="Titulo 02" categoria_xml="Categoría 2" fecha_xml="2008" thumbnail_xml="work/work02/thumb.png">  
   <pic titulo_xml="Titulo 03" categoria_xml="Categoría 1" fecha_xml="2008" thumbnail_xml="work/work03/thumb.png">  
   <pic titulo_xml="Titulo 04" categoria_xml="Categoría 3" fecha_xml="2008" thumbnail_xml="work/work04/thumb.png">  
</images>  


pero cargar los nodos que tenga el valor categoria_xml="Categoría 1". Ya pense en crear diferentes XML, pero me interesaría saber si se puede hacer todo en uno.

El uso practico sería para crear filtro del XML. Es decir ordenedar por categoría, fecha, etc..

Gracias,

Por mrxispas

36 de clabLevel



 

firefox
Citar            
MensajeEscrito el 17 Oct 2008 08:21 pm
Claro que lo mejor es tenerlo en un solo XML... la operación es sencilla, lees tu XML y depués en la función de acceder a los datos puedes filtrar este xml situando una condición para este atributo, después el resultado lo puedes guardar en un objeto o un arreglo.

Por elchininet

Claber

3921 de clabLevel

17 tutoriales

Genero:Masculino  

Front-end developer at Booking.com

firefox
Citar            
MensajeEscrito el 18 Oct 2008 01:03 pm
No lo había pensado así, además sería facil para el método que uso ahora. No uso object (aunque debería por optimizar mi código), uso un arreglo.

La teoría la entiendo, pero ponerlo en práctica es un gran paso para mi.

Este es mi código:

Código ActionScript :

//---Declaración de variables 
var myRoot = this; 
var espacioThumbs:Number = 10;
var thumbXML:XML = new XML(); 
var nodos:Array; 
 
thumbXML.ignoreWhite = true; 
 
//---Cuando se cargue el XML 
thumbXML.onLoad = function(success:Boolean):Void  { 
 
   if (success) { 
      nodos = thumbXML.firstChild.childNodes; 
      var total:Number = nodos.length; 
      var i:Number;
      for (i = 0; i < total; i++) {
         attachMovie("thumb","thumb"+i,i);
         myRoot["thumb"+i]._x = (myRoot["thumb"+i]._width+espacioThumbs)*i;
         myRoot["thumb"+i]._y = 0;
         myRoot["thumb"+i].tithumb = nodos[i].attributes.titulo_xml; 
         myRoot["thumb"+i].categoria = nodos[i].attributes.categoria_xml;
         myRoot["thumb"+i].fecha = nodos[i].attributes.fecha_xml;
         myRoot["thumb"+i].mes = nodos[i].attributes.mes_xml;
         myRoot["thumb"+i].cargaImg = "works/"+nodos[i].attributes.fecha_xml+"/"+nodos[i].attributes.categoria_xml+"/"+nodos[i].attributes.dossier_xml+"/"+nodos[i].attributes.thumbnail_xml;
         myRoot["thumb"+i].i = i;
         myRoot["thumb"+i].onRelease = function():Void{ 
            var rootImg = "works/"+nodos[this.i].attributes.fecha_xml+"/"+nodos[this.i].attributes.categoria_xml+"/"+nodos[this.i].attributes.dossier_xml+"/";
            _root.cerrarcontenido("visor.swf", _root.cont);
            _root.tithumb = nodos[this.i].attributes.titulo_xml;
            _root.categoria = nodos[this.i].attributes.categoria_xml;
            _root.fecha = nodos[this.i].attributes.fecha_xml;
            _root.mes = nodos[this.i].attributes.mes_xml;
            var totalImg:Number = nodos[this.i].childNodes.length;
            for (j = 0; j < totalImg; j++) {
               _root.cargaImg[j] = rootImg+nodos[this.i].childNodes[j].firstChild.nodeValue;
            }
            _root.desc = nodos[this.i].attributes.desc_xml;
            _root.webUrl = nodos[this.i].attributes.weburl_xml;
         }
      }
   } else { 
      trace("Error al cargar XML"); 
   } 
}; 
 
thumbXML.load("works.xml");


Entiendo que lo que debería de hacer es crear otro arreglo var categoría:Array y filtrar ese arreglo con unas condiciones, pero no se como hacerlo.

Por mrxispas

36 de clabLevel



 

firefox
Citar            
MensajeEscrito el 20 Oct 2008 11:18 am
No veo donde intentas filtrar el XML y crear el arreglo "categoría", por lo tanto no sé en que momento es que deseas hacerlo.

Por elchininet

Claber

3921 de clabLevel

17 tutoriales

Genero:Masculino  

Front-end developer at Booking.com

firefox
Citar            
MensajeEscrito el 20 Oct 2008 04:25 pm

mrxispas escribió:

...pero no se como hacerlo.


Por eso que no ves ningún arreglo. No se como lanzarme, por ejemplo, si pongo la siguiente condición para filtrar:

Código ActionScript :

if (myRoot["thumb"+i].categoria = "Categoría 1") {
    //que sentencía pongo!?
}


Esa condición, la pongo en el bucle? Fuera del bucle? O creo otro objecto new XML()?

Después, el código que he puesto anteriormente, es correcto para crear unos filtros? o tengo que convertirlo en objeto?

Y más preguntas que tengo, que hace que no se donde meter mano para filtrar mi XML.

Por mrxispas

36 de clabLevel



 

firefox
Citar            
MensajeEscrito el 20 Oct 2008 08:28 pm
No se si deseas filtrarlo del principio o al presionar unos de los thumbs creados con el xml sin filtrar u otra variante, el problema es que aunque no sepas hacerlo debes saber cuando deseas hacerlo, eso si no lo puedo saber desde acá.

Por elchininet

Claber

3921 de clabLevel

17 tutoriales

Genero:Masculino  

Front-end developer at Booking.com

firefox
Citar            
MensajeEscrito el 21 Oct 2008 08:04 am
De momento se me ocurre, que se cargue todo el XML al principio, después que se puedo filtrar mediante botones, en este caso botones de las categorías. Supongo que el evento de cada botón tendrá la function del filtro.

Por mrxispas

36 de clabLevel



 

firefox
Citar            
MensajeEscrito el 21 Oct 2008 10:01 am
Entonces creo que estoy en un error, tienes tantos botones como nodos tiene tu XML, es decir que estos botones son las imágenes, no entiendo entonces para qué deseas que al presionarlos se filtre el XML, lo que dices tuviera más lógica si los botones fueran categorías y que al presionarlos accediera a las imágenes dentro de esta categoría, una estructura de XML similar a la siguiente:

Código XML :

<?xml version="1.0" encoding="utf-8"?>   
<images>
   <cat nombre="Categoría 1">

      <pic titulo_xml="Titulo 01" fecha_xml="2008" thumbnail_xml="work/work01/thumb.png">
      <pic titulo_xml="Titulo 03" fecha_xml="2008" thumbnail_xml="work/work03/thumb.png">

   </cat>

   <cat nombre="Categoría 2">

      <pic titulo_xml="Titulo 02" fecha_xml="2008" thumbnail_xml="work/work02/thumb.png"> 

   </cat>

   <cat nombre="Categoría 3">

      <pic titulo_xml="Titulo 04" fecha_xml="2008" thumbnail_xml="work/work04/thumb.png"> 
   </cat>      
     
</images>


Quizás no sea esto lo que buscas, si no es esto entonces explica por pasos que deseas hacer cuando se presionen los botones y para qué deseas filtrar el XML.

Por elchininet

Claber

3921 de clabLevel

17 tutoriales

Genero:Masculino  

Front-end developer at Booking.com

firefox
Citar            
MensajeEscrito el 21 Oct 2008 05:26 pm
Tu propuesta me parece excelente, pero se puede cargar todo el xml? Supongo que si, pero el orden de los thumbs será el del XML. Es decir (en tu ejemplo) [1]Título 1, [2]Título 3, [3]Título 2 y [4]Título 4. Lo digo porque el orden que tiene mi XML es cronológico, y me interesa conservar este orden.

Yo pensaba añadir una condición. De tipo:

Código ActionScript :

function CategoriaUno() {
        if (Categoria.Nodo == "Categoría 1") {
                //Cargar el thumb de dicha categoría
        }
}


Después crearía un botón con evento CategoriaUno(), y me cargaría la condición.

Lo que pasa que no se que sentencia poner a las funciones. Tampoco se que orden meter a la hora de programar.

Por mrxispas

36 de clabLevel



 

firefox
Citar            
MensajeEscrito el 21 Oct 2008 09:09 pm
En la estructura de XML que te propuse había un error, no estaban cerrados los nodos de las pic, debe ser de esta manera:

Código XML :

<?xml version="1.0" encoding="utf-8"?>
<images>
   <cat nombre="Categoría 1">
      <pic titulo_xml="Titulo 01" fecha_xml="2008" thumbnail_xml="work/work01/thumb.png"/>
      <pic titulo_xml="Titulo 03" fecha_xml="2008" thumbnail_xml="work/work03/thumb.png"/>
   </cat>
   <cat nombre="Categoría 2">
      <pic titulo_xml="Titulo 02" fecha_xml="2008" thumbnail_xml="work/work02/thumb.png"/>
   </cat>
   <cat nombre="Categoría 3">
      <pic titulo_xml="Titulo 04" fecha_xml="2008" thumbnail_xml="work/work04/thumb.png"/>
   </cat>
</images>


Prueba este código (no lo remplaces por el que tienes, sólo pruébalo).
Mira bien los métodos que se utilizan y como se guarda todo en un arreglo que contiene objetos con todos los datos, esto creo que podría servirte para que puedas comprender como funciona:

Código ActionScript :

//---Declaración de variables  
var myRoot = this;
var thumbXML:XML = new XML();
thumbXML.ignoreWhite = true;

//---Declaración de variables
var datos:Array = new Array();

//---Cuando se cargue el XML  
thumbXML.onLoad = function(success:Boolean):Void  {

   if (success) {
      
      var nodos:Array = this.firstChild.childNodes;
      var total:Number = nodos.length;
      var i:Number;
      var thumb:MovieClip;
      var espacioThumbs:Number = 10;
      var obj:Object;
      
      for (i = 0; i < total; i++) {
         
         subNodos = nodos[i].childNodes;
         
         //---Añadir cada nodo al arreglo
         obj = new Object();
         obj.nombre = nodos[i].attributes.nombre;
         obj.images = subNodos;
         
         datos[i] = obj;
         
         thumb = myRoot.attachMovie("thumb", "thumb" + i, myRoot.getNextHighestDepth());
         thumb._x = (thumb._width + espacioThumbs) * i;
         thumb.numero = i;
         
         //---Acción de los botones
         thumb.onRelease = function():Void{
            
            trace("las imagenes pertenecientes a la " + datos[this.numero].nombre + " son:");
            trace(datos[this.numero].images);
            
         }
         
      }
      
   } else {
      trace("Error al cargar XML");
   }
};

thumbXML.load("works.xml");

Por elchininet

Claber

3921 de clabLevel

17 tutoriales

Genero:Masculino  

Front-end developer at Booking.com

firefox
Citar            
MensajeEscrito el 22 Oct 2008 11:34 am
Creo que hay una confusión, he preparado este ejemplo, para entender la idea de las categorías: http://www.romanjusdado.com/ejemplos/filtroXML.jpg

Ahora mismo, los thumbs de la web, es un swf externo. Y no me importaría crear varios SWF externos para cada categoría, lo que me interesa es que se haga desde un solo XML. Si elijo la categoría WEB, que se cargen los thumbs correspondiente al XML, y así con todas las categorías.

Por mrxispas

36 de clabLevel



 

firefox
Citar            
MensajeEscrito el 22 Oct 2008 10:14 pm
Esto que te he posteado te sirve para eso, no se si notaste que si presionas el botón 1 te devuelve en el trace las imagenes que pertenecen a esta categoría, no tienes que tener varios SWF, puedes tener un solo XML y que se carguen dinamicamente las imágenes pertenecientes a cada seccion.

Por elchininet

Claber

3921 de clabLevel

17 tutoriales

Genero:Masculino  

Front-end developer at Booking.com

firefox
Citar            
MensajeEscrito el 23 Oct 2008 11:34 am
Si probé el código y la idea me parece estupenda, pero si imprimo por completo el XML, ya no tendrá orden cronológico (como actualmente lo tengo puesto en la web).

Pero, con el código que me haz facilitado, puedo partir de una buena base, voy a experimentar y a ver que consigo.

Una vez mas, muchísimas gracias elchininet!

Por mrxispas

36 de clabLevel



 

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.