Comunidad de diseño web y desarrollo en internet online

Bucle infinito en XML ?

Citar            
MensajeEscrito el 16 Dic 2004 10:01 am
Wenas:

Estoy realizando una aplicación q utiliza XML para leer los datos. El caso es q los datos son un mogollón, pq lo q tengo q hacer es un catálogo y creo q tiene como 600 hojas y 3000 referencias.

Tengo una duda y un problema:

Mi duda
Hay algún tipo de restricción en XML y Flash determinada por el número de elementos dentro del XML? Es decir, su hago un fichero q contenga el nombre de todos los chinos de China (por ejemplo), el flash lo podrá leer? No se petará? Me mandará al carajo? jejeje. O sea, q si una programación en flash puede leer 20 registros de un Xml, podrá leer 20.000 ?

Mi problema
Después de crear la aplicación utilizando un fichero Xml de prueba con 50 referencias, me he puesto a añadir el resto de referencias y a la hora de ejecutar el flash se ha vuelto loco. Se ha empezado a reproducir por completo, sin respeta stop(), gotoAnd..() ni nada parecido; y después me ha aparecido lo siguiente:

Se sobrepasaron 256 niveles de recurrencia en una lista de acción.
Probablemente se trate de un bucle sin fin.
No podrá efectuar más acciones en esta película.

Alguien me puede explicar pq le pasa eso?

Mi Xml tiene la siguiente estructura:

Código :

 
<?xml version="1.0" encoding="ISO-8859-1"?> 
<modelos> 
   <mod ref="1027102" tipo="alto" medida="27" mueble="ABATIBLES DE 27 cm" mano="A" articulo="COLGANTE ABATIBLE" texto="Puerta abatible. Opción trasera remetida. Compás con regulación de retención."> 
      <ancho medida="30">69,70,72,77,102,108,111,113,116,121</ancho> 
      <ancho medida="35">70,72,74,80,103,109,113,115,117,122</ancho> 
      <ancho medida="40">71,73,75,81,103,109,113,115,117,122</ancho> 
      <ancho medida="45">73,75,77,83,105,112,114,117,120,125</ancho> 
      <ancho medida="50">74,77,79,85,106,118,115,118,122,127</ancho> 
      <ancho medida="60">78,81,83,90,108,115,118,121,125,130</ancho> 
      <ancho medida="70">87,90,92,101,125,133,137,141,145,151</ancho> 
      <ancho medida="80">96,99,101,111,142,151,156,160,165,172</ancho> 
      <ancho medida="90">112,116,120,130,176,189,194,200,206,216</ancho> 
      <ancho medida="120">132,136,140,152,196,209,214,220,226,236</ancho> 
   </mod> 
..... 
</modelos> 

... y así el resto de las 1700 líneas del xml


Un saludo, gracias

Por kavik666

35 de clabLevel



 

msie
Citar            
MensajeEscrito el 16 Dic 2004 10:21 am
una cosa importante... este trabajo lo tengo q terminar antes de Navidad, por lo q me resulta URGENTE e IMPRESCINDIBLE solucionar este problema. :(

Por kavik666

35 de clabLevel



 

msie
Citar            
MensajeEscrito el 16 Dic 2004 03:27 pm
estas llamando a una aplicacion recursiva en alguna parte algo del tipo

function hola() {
hola();
};

postea el code a ver onde ta el fallo

Por _CONEJO

BOFH

7639 de clabLevel

17 tutoriales
21 articulos

 

firefox
Citar            
MensajeEscrito el 16 Dic 2004 03:32 pm
yo creo q 20000 registros de ese tipo enviaran varias ventanas de "anular script.."

el error de recursion esta en el codigo donde se parsea el XML, podria publicarlo?

Por _david

565 de clabLevel


1 articulo

Genero:Masculino  

Bogota, Colombia

msie
Citar            
MensajeEscrito el 16 Dic 2004 04:34 pm
Por favor publica el codigo de ActionScript que usas; puede ser que

a) Haya un error en tu instrucción de control de la recursión de la recursión de la recursión ...
b) Sea tu arbol exageradamente largo

En estos casos lo mejor es inventarse algun sistema de paginación que NO cargue TODO el XML, sino solamente una parte de este; lo necesario

Por Freddie

BOFH

53 tutoriales
597 articulos
43 ejemplos

Genero:Masculino   Admin

Conserje de Cristalab

firefox
Citar            
MensajeEscrito el 16 Dic 2004 04:42 pm
Hola, y gracias por intentar ayudarme.

El código de lectura del Xml lo tengo en un archivo .as:

Código :

//-----------------------------------------------------------------------------
function creaAtributos (atributos, objeto, nivel)
{
   var idx;
   var i;
   if (nivel == null) nivel = 0;

   var ident = nivel+" ";
   for (i=0; i<nivel; i++) ident += "\t";

   for (idx in atributos) {
      // trace(ident + typeof(atributos[idx]) + ": " + idx );
      objeto[idx] = atributos[idx];
   }
}

//-----------------------------------------------------------------------------
function creaObjetos (objeto, pariente, nivel)
{
   if (nivel == null) nivel = 0;
   var ident = nivel+" ";
   var i;
   var idx;

   // Analizar el nivel de recursividad para mostrar trace.
   for (i=0; i<nivel; i++) {
      ident += "\t";
   }

   // Analizamos el objeto: Las variables interesantes son:
   // - nodeName (nombreNodo)
   // - nodeType (tipoNodo)
   // - nodeValue (valorNodo)
   // - attributes (atributos)
   // - firstChild (primerHijo) ---- Para recursividad.
   for (idx in objeto) {
      // trace(ident + typeof(objeto[idx]) + ": " + idx );
      if (idx == "nodeName") {
         var nombreNodo = objeto[idx];
      } else if (idx == "nodeType") {
         var tipoNodo = objeto[idx];
      } else if (idx == "nodeValue") {
         var valorNodo = objeto[idx];
      //   trace (valorNodo);
      } else if (idx == "attributes") {
         var atributos = objeto[idx];
         //   trace (atributos);
      } else if (idx == "firstChild") {
         var primerHijo = objeto[idx];
      }
   }

    var cuantos = 0;
   if ((tipoNodo == 1) && (nombreNodo != null) && (nombreNodo != "null")) {

      // Vamos a meter los atributos en el objeto.
      // ¿No está definido?
      if (pariente[nombreNodo] == undefined) {
         pariente[nombreNodo] = new Array();
      }
      cuantos = pariente[nombreNodo].length;
      pariente[nombreNodo][cuantos] = new Object();
      //   trace (pariente[nombreNodo]);
      creaAtributos(atributos, pariente[nombreNodo][cuantos], nivel+1);
   } else if (tipoNodo == 3) {
      pariente._valor = valorNodo;
      //  trace (pariente);
   }

   // Recursividad
   if (primerHijo != null) {
      if (nombreNodo == null) {
         creaObjetos(primerHijo, pariente, nivel+1);
      } else {
         creaObjetos(primerHijo, pariente[nombreNodo][cuantos], nivel+1);
      }
   }

   // Seguir con los objetos del mismo nivel...
   if (objeto.nextSibling != null) {
      creaObjetos(objeto.nextSibling, pariente, nivel);
   }
}

//-----------------------------------------------------------------------------
function cargaXML( url, funcion_llamada ) {
//    delete _root.mapa;

    _root.datosXML = new XML();
    _root.datosXML.onLoad = recibidoXML;
    _root.datosXML.llamadaFuncion = funcion_llamada;
    _root.datosXML.load( url );
   return;
}

//-----------------------------------------------------------------------------
function recibidoXML( correcto ) {
   creaObjetos(datosXML, _root);
    datosXML.llamadaFuncion(correcto);
   return;
}

//-----------------------------------------------------------------------------
function toNumber(str){
   return str.substr(0, str.indexOf(","))+"."+str.substr(str.indexOf(",")+1);
}



Y la llamada es la siguiente, en la película princiapl, frame 1:

Código :

#include "funciones/funcionesXML.as"
cargaXML( "basedatos/catalogo.xml" , datosRecibidos );

// Carga del XML
function datosRecibidos(correcto) {
   if (correcto) {
      _root.cuantostotal = _root.modelos[0].mod.length;
   } else {
      gotoAndStop ("failed");
   }
}


Hasta ahora, con 20 registros, ha funcionado perfectamente. Pero al añadir unos cuantos registros (como 1700 líneas al xml) ha sido cuando me ha dado error. He comprobado q hasta cierto número de registros me los acepta. He revisado todo el xml a ver si habían fallos de escritura, pero nada. :?

Necesito solucionar esto :cry: , una ayudita, plissssss

Por kavik666

35 de clabLevel



 

msie
Citar            
MensajeEscrito el 16 Dic 2004 05:01 pm
pues no se, pero la recursividad falla [o eso o se ejecutan cuando los datos no estan 100% cargados]

yo de ti pondria un trace aki

" // Recursividad
if (primerHijo != null) { "
trace(primerHijo); a ver que te sale... kreo que ahi esta el problema

aunque el problema REAL kreo que esta aki :

Código :

// Seguir con los objetos del mismo nivel...
   if (objeto.nextSibling != null) {
      creaObjetos(objeto.nextSibling, pariente, nivel);
   } 


ya qu elo que esto hace es ...parsea un nodo ANTES de terminar de parsear llama a otro y este a otro a otro a otro a otro.... SOLO CUANDO TERMINE el ultimo se empezaran a cerrar.... klaro con 20 no pasa nada pero mas de 256 ... peta ... soluciones¿?¿?

haria algo como meterlo dentro de un while la condicion crea objeto o algo...

Por _CONEJO

BOFH

7639 de clabLevel

17 tutoriales
21 articulos

 

firefox
Citar            
MensajeEscrito el 16 Dic 2004 05:07 pm
Gracias Icem4n... pero podrías ser algo más concreto? Esto algo espesito últimamente y no termino de entender lo q me dices. Es la primera vez q trabajo con Xml y este código lo estoy reutilizando.
Me imagino q no debe ser muy complicado leer un archivo xml y concantanarlo, más aún cuando mi xml es largo pero sencillo:

Código :

   <mod ref="1067195" tipo="alto" medida="67" mueble="COLGANTES DE 67 cm" mano="ID" articulo="COLGANTE REDUCCION EN CHAFLAN" texto="Una puerta. Dos baldas. El representado corresponde a la mano derecha.">
      <ancho medida="40">114,117,119,126,146,153,158,162,166,172</ancho>
      <ancho medida="45">117,120,122,129,149,156,161,165,170,176</ancho>
      <ancho medida="50">119,123,126,134,151,159,163,169,176,182</ancho>
      <ancho medida="60">123,126,129,137,154,162,197,174,182,189</ancho>
   </mod>
   <mod ref="1067407" tipo="alto" medida="67" mueble="CORREDERAS DE 67 cm" mano="E" articulo="VITRINA ALUMINIO CORREDERA" texto="Dos puertas vitrina aluminio sobre correderas. Dos baldas cristal regulable. Fondo total 35 cm.">
      <ancho medida="90">270,270,270,270,270,270,270,270,270,270</ancho>
      <ancho medida="120">312,312,312,312,312,312,312,312,312,312</ancho>
   </mod>

Es esto mismo pero multiplicado por...... :shock: o más

gracias de nuevo, intentaré desperta mi neurona, pero un poco de luz no me vendría mal :wink:

Por kavik666

35 de clabLevel



 

msie
Citar            
MensajeEscrito el 16 Dic 2004 05:15 pm
Acabo de probar lo de:

" // Recursividad
if (primerHijo != null) { "
trace(primerHijo); a ver que te sale... kreo que ahi esta el problema


El trace me muestra todos los hijos con su contenido, ordenado del primero al último. Algo como esto:
    114,117,119,126,146,153,158,162,166,172
    117,120,122,129,149,156,161,165,170,176
    119,123,126,134,151,159,163,169,176,182
    123,126,129,137,154,162,197,174,182,189

    270,270,270,270,270,270,270,270,270,270
    312,312,312,312,312,312,312,312,312,312


Es eso lo q debería mostrar,no?

Por kavik666

35 de clabLevel



 

msie
Citar            
MensajeEscrito el 16 Dic 2004 05:18 pm
bueno tendrias algo como...

num_obj = 0;

while(num_obj>=0) {

if(num_obj==obj_actual) {
obj_actual++;
creaObjeto(parametros pasados con _root.var [_root.proximo,_root.pariente,_root.nivel])
}
}

// Seguir con los objetos del mismo nivel...
if (objeto.nextSibling != null) {

_root.proximo = objeto.nextSibling;
_root.parient = pariente;
_root.nivel = nivel);
num_obj++;
} else {
num_obj = -1; //esto tendria que terminar con el while y por tanto de parsear la info
};

Por _CONEJO

BOFH

7639 de clabLevel

17 tutoriales
21 articulos

 

firefox
Citar            
MensajeEscrito el 16 Dic 2004 05:31 pm
a ver si lo entiendo....

he quitado lo siguiente de mi código

Código :

   // Seguir con los objetos del mismo nivel...
   if (objeto.nextSibling != null) {
      creaObjetos(objeto.nextSibling, pariente, nivel);
   }


y he añadido esto otro:

Código :

num_obj = 0; 
while(num_obj>=0) { 
   if(num_obj==obj_actual) { 
      obj_actual++; 
      creaObjeto(_root.proximo,_root.pariente,_root.nivel);
   } 
} 

// Seguir con los objetos del mismo nivel... 
if (objeto.nextSibling != null) { 
   _root.proximo = objeto.nextSibling; 
   _root.parient = pariente; 
   _root.nivel = nivel; 
   num_obj++; 
} 
else { 
   num_obj = -1; //esto tendria que terminar con el while y por tanto de parsear la info 
};


y he creado tres variables en _root: proximo, pariente, nivel.

Es eso lo q dices? Es q da error de script, algún bucle se queda pillao

Por kavik666

35 de clabLevel



 

msie
Citar            
MensajeEscrito el 16 Dic 2004 05:35 pm
nooo no no no

esto:
// Seguir con los objetos del mismo nivel...
if (objeto.nextSibling != null) {
creaObjetos(objeto.nextSibling, pariente, nivel);
}

por :
// Seguir con los objetos del mismo nivel...
if (objeto.nextSibling != null) {
_root.proximo = objeto.nextSibling;
_root.parient = pariente;
_root.nivel = nivel;
num_obj++;
}
else {
num_obj = -1; //esto tendria que terminar con el while y por tanto de parsear la info
};



y esto :

function recibidoXML( correcto ) {
creaObjetos(datosXML, _root);
datosXML.llamadaFuncion(correcto);
return;
}


por cierto... reza para no tener mas de 256 niveles o moriras!! seria imposible....
por :

function recibidoXML( correcto ) {
num_obj = 0;
while(num_obj>=0) {
if(num_obj==obj_actual) {
obj_actual++;
creaObjeto(_root.proximo,_root.pariente,_root.nivel);
}
}
datosXML.llamadaFuncion(correcto);
return;
}

Por _CONEJO

BOFH

7639 de clabLevel

17 tutoriales
21 articulos

 

firefox
Citar            
MensajeEscrito el 16 Dic 2004 05:47 pm
Nada, todo igual. Cuando empieza a reproducirse la animación q crea la interface, se queda parado y luego sale el mensajito de error q indica q hay un script q provoca q se reproduzca lentamente :(

Lo de tener 356 niveles.. a q te refieres? Pq sería imposible? Un nivel es esto?
    <mod ref="1040503" tipo="alto" medida="40" mueble="ELEVABLE DE 40 cm" mano="E" articulo="VITRINA ALUMINIO ACABADO INTERIOR" texto="Una puerta aluminio elevable. Una balda de cristal. Acabado interior. Altura no modificable.">
    <ancho medida="60">390,390,390,390,390,390,390,390,390,390</ancho>
    <ancho medida="90">440,440,440,440,440,440,440,440,440,440</ancho>
    <ancho medida="120">485,485,485,485,485,485,485,485,485,485</ancho>
    </mod>


Pq si es así, tengo más de 256 seguro. Y cerca de las 1000 también. :o

Por kavik666

35 de clabLevel



 

msie
Citar            
MensajeEscrito el 16 Dic 2004 05:55 pm
padre
.hijo1
..nieto1
..nieto2
...bisnieto1
..nieto3
.hijo2

eso son 4 niveles [pedre/hijo/nieto/bisnieto]

bueno, tengo una pregunta.... para que lo haces¿?¿? jajajaja no seria mas facil ir por "ramas", es decir en un primer lugar cogemos los nodos principales, y SI SOLO SI, necesitamos realizar alguna accion con algun nodo "principal", entonces recojesmos sus datos [los de ese nodo] asi ya no serian 1000, sino a lo mejor irian de 100 en 100 o algo asi... saludetes

Por _CONEJO

BOFH

7639 de clabLevel

17 tutoriales
21 articulos

 

firefox
Citar            
MensajeEscrito el 16 Dic 2004 06:11 pm
Creo q lo he entendido.

Yo tengo un padre q sería
<modelos>
de donde cuelgan los hijos, q tienen la siguiente estructrura:
<mod ref="1111" tipo="alto" medida="27" mueble="Vitrina"....>.
Y dentro de cada hijo tendría los nietos, q serían así:
<ancho medida="30">69,70,72,77,102,108,111,113,116,121</ancho>
<ancho medida="35">70,72,74,80,103,109,113,115,117,122</ancho>
.....

no? es correcto?

Bueno, la aplicación es un catálogo de muebles en flash para un cd, con el propósito de repartirlo entre proveedores y q puedan realizar un pedido, eligiendo los muebles. Y ese pedido es enviado a una base de datos donde se almacena y se puede modificar. Y cuando arregle este problema, espero q sea autoactualizable 8)

Tambien he pensado lo segundo q me comentas. Los muebles están dividos por tipos (altos,bajos,columnas,complementos,accesorios) y a su vez en alturas (30,35,40,50....). Para ver esos muebles hay dos menús; en el primero eliges el tipo y en el segundo la altura.
El problema es q he inentado leer sólo los muebles de un tipo y una altura, pero no me hace ni caso.
Y a parte de eso, tendría una duda: si consiguese leerlos por separado, si por ejemplo selecciono un mueble de altura 30, tendía q hacer una lectura a xml de un mueble 30. Y si luego me voy a 40, tendría q elegir todos los muebles de 40. Pero si vuelvo a pinchar a 30, la lectura del xml de todos los muebles de 30 se haría otra vez, no?
No sé si me he explicado.


Por cierto, lo de 256 niveles... q pasa si me paso de ello?

Por kavik666

35 de clabLevel



 

msie
Citar            
MensajeEscrito el 16 Dic 2004 07:28 pm
NO no no

cuando flash se refiere a niveles de recursion es lo siguiente:


function calcular(valor)
{
if(valor>0)
calcular(valor-1)
else
return 1;
}

//no hace nada, es solo un ejemplo
//prueban la funcion pasando como parametro por ejemplo 200, y luego 260


como ven, dentro de la funcion calcular() se hace un llamado a la misma funcion. 256 niveles de recursion significa que se ha diseñado mal la funcion, y no tiene un punto en q se detenga la recursividad antes q se llamae a ella misma 256 veces:

function algo()
{
algo();
}

la "excepcion" q arroja flash de los 256 niveles de recursion es para evitar bloqueos, y no tiene nada q ver con los "niveles" de un XML.

Por _david

565 de clabLevel


1 articulo

Genero:Masculino  

Bogota, Colombia

msie
Citar            
MensajeEscrito el 16 Dic 2004 07:40 pm
en cuanto al mensaje de anular script, flash por defecto lo muestra una vez alguna funcion detienen el hilo de ejecucion durante un tiempoo determinado (este no es posible configurarlo, solo con un hack al flash player)

prueben este codigo:

for(var i=0;i<=1000000;i++)
{
trace(i);
}

a mi me salio el aviso en 322086

cuando se trabaja con un XML demasiado extenso, esto puede ocurrir

Por _david

565 de clabLevel


1 articulo

Genero:Masculino  

Bogota, Colombia

msie
Citar            
MensajeEscrito el 16 Dic 2004 07:43 pm
lo mejor seria diseñar el XML de tal forma q haya un maestro/detalle, q se cargue solo la informacion principal y existan archivos con los detalles de cada nodo.

pd. un xml con datos separados por comas? HEREJIA!!!

Por _david

565 de clabLevel


1 articulo

Genero:Masculino  

Bogota, Colombia

msie
Citar            
MensajeEscrito el 17 Dic 2004 07:43 am
vale, voy entendiendo.

1.- O sea, q lo de 256 se refiere al número de recursiones dentro del Flash.
2.- En ningún sitio he visto q poner comas en un Xml sea malo... no se me ocurrió mejor forma de hacerlo. Alguien tiene una mejor forma de hacer un catálogo ???
3.- Sigo sin encontrar una solución. Lo de q hayan archivos para cada detalle de cada nodo... me parece sencillamente trabajo de chinos (aún más de lo q me está resultando ya).
4.- A pesar de q dé el fallo de script... funcionaría la aplicación? O sea, q en lugar de pulsar 'No deseo continuar ejecutando el script' pulsase sí, leería todos los datos del Xml ?


Poco a poco voy viendo la luz, pero esto sigue sin funcionar :(

Por kavik666

35 de clabLevel



 

msie
Citar            
MensajeEscrito el 20 Dic 2004 08:48 am
hmmm, creo q esta vez me voy a quedar sin tener claro la causa de mi problema :(

Weno, da igual, intentaré dividir todo el Xml para q lo lea por separado.

Por kavik666

35 de clabLevel



 

msie
Citar            
MensajeEscrito el 20 Dic 2004 12:20 pm
una cuestión:

creo q he conseguido dividir el xml (espero), pero ahora e stá haciendo la pirula la llamada a la función q lee el Xml, q antes lo hacía bien pero ahora no.
En un principio tenía la lectura del xml en el incio de la película, lo cargaba y todo perfecto; pero ahora esa carga la tengo en cada botón para q lea sólo un archivo xml. Lo q pasa es q me dice q ese archivo está vacio pero al volver a pinchar el mismo botón, me funciona perfectamente :crap:

Alguna idea de pq pasa esto?

Por kavik666

35 de clabLevel



 

msie

 

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