Comunidad de diseño web y desarrollo en internet online

Recuperar datos de un XML cargado

Citar            
MensajeEscrito el 19 Dic 2008 10:31 pm
Hola a todos,
Estoy trabajando en as3 por primera vez y he tenido problemas para solucionar un problema puntual.

Tengo una función que carga un XML y funciona bien:

Código :

var xmlLoader:URLLoader = new URLLoader();
var xmlDatos:XML = new XML();
var preguntaList:XMLList;
 
xmlLoader.addEventListener(Event.COMPLETE, LoadXML);
xmlLoader.load(new URLRequest("datos.php"));
 
function LoadXML(ex:Event) {
   xmlDatos = new XML(ex.target.data);
   PasarPregunta(xmlDatos);
   }

function PasarPregunta(preguntaInput:XML) {
   var preguntaList:XMLList = preguntaInput.pregunta.numero;
   trace(preguntaList[0]);
   }


Todo bien ahí. Un poco más abajo necesito llamar a la variable preguntalist, pero me da null, ¿cómo hago para poder utilizar la información del XML en otra función?

Por ejemplo, si a continuación del código de arriba, agrego:

Código :

trace(preguntaList[0]);


Eso da null, porque se ejecuta antes que la función de arriba, pero como no soy un experto (es mi primera vez), no sé como hacer para que funcione... ojalá con un ejemplo didáctico chicos.. :oops:

Saludos!

Por -Javier-

21 de clabLevel



Genero:Masculino  

Diseñador programático o Programador gráfico

firefox
Citar            
MensajeEscrito el 19 Dic 2008 10:56 pm
Le tienes que quitar el "var" en la función pasarPregunta, sino, considerará esa variable distinta a la variable general.
Vamos, en Flash (y en la vida en general) tenemos variables globales para toda la película

Código ActionScript :

var xmlLoader:URLLoader = new URLLoader();
var xmlDatos:XML = new XML();
var preguntaList:XMLList;

y variables locales que usamos en las funciones. Aunque en las funciones podemos usar las variables globales anteriores

Código ActionScript :

 function cualquiera(){
    var temporal:int=4; //por tener "var" es local
    trace(preguntaList)  //puedo hacer un trace de una variable global
    //si escribimos var con el mismo nombre NO cambia el valor de la variable global
    var xmlDatos:XML=null //<--es distinta de la de la película general
}

Por Eliseo2

710 de clabLevel



 

msie7
Citar            
MensajeEscrito el 20 Dic 2008 12:14 pm
Yo creo que la funcion se debe de quedar asi:

Código :

function PasarPregunta(preguntaInput:XML) {
   preguntaList = preguntaInput.pregunta.numero;
   trace(preguntaList[0]);
   }

Por steve29

9 de clabLevel



 

Córdoba

firefox
Citar            
MensajeEscrito el 23 Dic 2008 07:05 pm
Gracias Eliseo2 y steve29, por sus respuestas. Aún sacando el "var", el trace dentro de la función funciona, pero el trace fuera de la función no. ¿Por qué el trace fuera de la función se ejecuta primero? Parece que el problema radica en eso, pero no comprendo como solucionarlo.

Saludos!

Por -Javier-

21 de clabLevel



Genero:Masculino  

Diseñador programático o Programador gráfico

firefox
Citar            
MensajeEscrito el 23 Dic 2008 09:51 pm
Tengo esta función asociada a un botón:

Código :

flecha.addEventListener(MouseEvent.CLICK,fflecha);

function cargar(preg) {      
      preguntas.load(new URLRequest("preg_" +  preguntaList[preg] + ".swf"));
      addChild(pregnumero);
      pregnumero.text = preguntaList[preg];
     }

function fflecha(event:MouseEvent):void {
   pregunta.removeChild(preguntas);
   cargar(i);
   i += 1;
}


No está tomando la variable preguntaList, a pesar de haber hecho los cambios. Me funciona en el navegador Chrome, pero no en los otros (firefox, Opera, etc), ¿qué raro eso no?

Saludos!

Por -Javier-

21 de clabLevel



Genero:Masculino  

Diseñador programático o Programador gráfico

firefox
Citar            
MensajeEscrito el 24 Dic 2008 08:33 am
Tienes que esperar siempre a que se hala cargado el fichero XML.
Cuando hacemos un load, Flash sólo "manda cargar" (técnicamente hace una llamada asíncrona) y luego continúa el flujo del programa. Vamos, no espera a que se halla cargado y continúa. Por eso no tiene ningún valor xmlDatos. Tienes que tener cuidado porque a veces parece que sí funciona porque los datos están cargados en caché, pero realmente no está funcionando.
p.e.

Código ActionScript :

var xmlLoader:URLLoader = new URLLoader(); 
var xmlDatos:XML = new XML(); 
var preguntaList:XMLList; 
xmlLoader.addEventListener(Event.COMPLETE, LoadXML);
xmlLoader.load(new URLRequest("datos.php"));
 
function LoadXML(ex:Event) {
   xmlDatos = new XML(ex.target.data);
   preguntaList = xmlDatos.pregunta.numero;
   trace(preguntaList[0]) //saldrá el valor
}
trace(preguntaList[0]) //saldrá "undefined"


Lo que se suele hacer, cuando tenemos una película que depende fuertemente de que se complete un load es hacer una función init y llamarla en la función onLoad. Vamos, imagina que tenemos una película como

Código ActionScript :

intrucción 1
instrucción 2
addEventListener
....

La vamos a transformar. Primero creamos una función

Código ActionScript :

function init():void{
  instrucción 1
  instrucción 2
  addEventListener
   ....
}

Y es en la función LoadXML, llamamos a la función init

Código ActionScript :

xmlLoader.addEventListener(Event.COMPLETE, LoadXML);
xmlLoader.load(new URLRequest("datos.php"));

function LoadXML(ex:Event) {
   xmlDatos = new XML(ex.target.data);
   preguntaList = xmlDatos.pregunta.numero;
   init();
}

No sé si es ese el problema, o tienes un problema con la variable "i"

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 24 Dic 2008 02:07 pm
Gracias por tu respuesta. Me perdí con la función init, ¿qué debería contener? el addlistener para activar el botón y las funciones relacionadas?

Saludos!

ps: la variable "i" funciona sin problemas, esta debidamente declarada en otra sección del código que no puse acá.

Por -Javier-

21 de clabLevel



Genero:Masculino  

Diseñador programático o Programador gráfico

firefox
Citar            
MensajeEscrito el 26 Dic 2008 10:44 am
Debería contener TODO salvo el listener del XML y el load del XML

Por Eliseo2

710 de clabLevel



 

msie7
Citar            
MensajeEscrito el 29 Dic 2008 03:52 pm
Ok, después de hacer muchas pruebas, descubrí que la función LoadXML no esta funcionando al subirla al servidor. Si funciona en modo local, cuando pruebo la película en flash, pero no está leyendo cuando la pruebo en algún navegador.

Saludos,

Por -Javier-

21 de clabLevel



Genero:Masculino  

Diseñador programático o Programador gráfico

firefox
Citar            
MensajeEscrito el 29 Dic 2008 04:13 pm
No he dicho nada... ahora funcionó... Muchas Gracias!!!

Por -Javier-

21 de clabLevel



Genero:Masculino  

Diseñador programático o Programador gráfico

firefox
Citar            
MensajeEscrito el 13 Mar 2010 02:51 pm
Hola, hice algo asi... pero Creé el XML desde PHP, luego al recuperarlo en as3 lo convertí en DataProvider y de ahi es muy facil convertirlo en ComboBox, DataGrid, List etc...

Por mikeggg

3 de clabLevel



Genero:Masculino  

msie8

 

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