Foros del Web » Creando para Internet » Flash y Actionscript »

Trabajar xml en flash

Estas en el tema de Trabajar xml en flash en el foro de Flash y Actionscript en Foros del Web. Buenas Pues les comento, estoy realizando una aplicación que necesita leer un xml como primera medida para 'alimentar' toda la aplicación (menús, submenús, etc) El ...
  #1 (permalink)  
Antiguo 29/09/2009, 21:20
Avatar de mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.805
Antigüedad: 14 años, 7 meses
Puntos: 214
Trabajar xml en flash

Buenas
Pues les comento, estoy realizando una aplicación que necesita leer
un xml como primera medida para 'alimentar' toda la aplicación (menús, submenús, etc)

El xml es el siguiente

Código xml:
Ver original
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <cats>
  3. <cat id ="1" name="Tarjetas personales">
  4.     <subcat id ="1" name = "Tarjeta Regalo">
  5.         <sub_subcat id ="1" name = "None">
  6.             <frame id = "1" thumbnail = "thumbs/frames/1.png" image = "imgs/frames/1.png" />
  7.             <frame id = "2" thumbnail = "thumbs/frames/2.png" image = "imgs/frames/2.png" />            
  8.             <background id = "1" thumbnail = "thumbs/background/red.png" image = "imgs/background/red.png" />
  9.             <background id = "2" thumbnail = "thumbs/background/blue.png" image = "imgs/background/blue.png" />
  10.             <image id = "1" thumbnail = "thumbs/images/red.png" image = "imgs/images/red.png" />
  11.             <image id = "2" thumbnail = "thumbs/images/blue.png" image = "imgs/images/blue.png" />
  12.         </sub_subcat>
  13.     </subcat>
  14. </cat>
  15. <cat id ="2" name = "Tarjetas y Sobre Lord">
  16.     <subcat id ="1" name = "Invitaciones">
  17.         <sub_subcat id ="1" name = "Matrimonio">
  18.             <frame id = "1" thumbnail = "thumbs/frames/top.png" image = "imgs/frames/top.png" />
  19.             <background id = "1" thumbnail = "thumbs/background/red.png" image = "imgs/background/red.png" />
  20.             <image id = "1" thumbnail = "thumbs/images/red.png" image = "imgs/images/red.png" />    
  21.         </sub_subcat>
  22.         <sub_subcat id ="2" name = "Grados">
  23.             <frame id = "1" thumbnail = "thumbs/frames/top.png" image = "imgs/frames/top.png" />
  24.             <background id = "1" thumbnail = "thumbs/background/red.png" image = "imgs/background/red.png" />
  25.             <image id = "1" thumbnail = "thumbs/images/red.png" image = "imgs/images/red.png" />    
  26.         </sub_subcat>
  27.     </subcat>
  28.     <subcat id ="2" name = "Mensajes">
  29.         <sub_subcat id ="1" name = "Agradecimiento">
  30.             <frame id = "1" thumbnail = "thumbs/frames/top.png" image = "imgs/frames/top.png" />
  31.             <background id = "1" thumbnail = "thumbs/background/red.png" image = "imgs/background/red.png" />
  32.             <image id = "1" thumbnail = "thumbs/images/red.png" image = "imgs/images/red.png" />            
  33.         </sub_subcat>
  34.     </subcat>    
  35. </cat>
  36. </cats>

Como podrán ver, tiene el nodo principal cats, dentro tiene cat (categorias) que son los menús principales
Luego, cada cat puede tener varias subcat (subcategorias)
A su vez, las subcat pueden tener varias sub_subcat (sub_subcategorias)
Y finalmente, estas sub_subcat tienen varios frame, background e image

Para leer este xml hago lo siguiente
Código as:
Ver original
  1. function onXmlInfoComplete(event:Event) {
  2. //aSubCategory, aChildSubCategory,aFrames,aBackgrounds son arrays
  3. var oSettingsXml = XML(event.target.data);
  4.     i = 0;
  5.     j = 0;
  6.     k = 0;
  7.     for each(oInfo in oSettingsXml.cat) {
  8. //Obtain the subcategories
  9.         for each(oInfo2 in oInfo.subcat) {
  10.             aSubCategory[i] = { idcat: oInfo.attribute('id'), id: oInfo2.attribute('id'), name: oInfo2.attribute('name') };
  11.             //Obtain the subsubcategories
  12.             for each(oInfo3 in oInfo2.sub_subcat)
  13.             {
  14.                 //aChildSubCategory[oInfo2.attribute('id')] = { idsubcat: oInfo2.attribute('id') , id: oInfo3.attribute('id'), name: oInfo3.attribute('name') };
  15.                 aChildSubCategory[j] = { idcat: oInfo.attribute('id'), idsubcat: aSubCategory[i]['id'] , id: oInfo3.attribute('id'), name: oInfo3.attribute('name') };
  16.                 //Obtain frames
  17.                 for each(oInfo4 in oInfo3.frame)
  18.                 {
  19.                     //aFrames[oInfo3.attribute('id')] = { idsubsubcat: oInfo3.attribute('id') , thumbnail: oInfo4.attribute('thumbnail') };
  20.                     aFrames[k] = { idcat: oInfo.attribute('id'), idsubcat: aChildSubCategory[j]['idsubcat'] , idsubsubcat: oInfo3.attribute('id') , thumbnail: oInfo4.attribute('thumbnail'), image: oInfo4.attribute('image') };
  21.                     k++;
  22.                 }
  23.                 k = 0;
  24.                 for each(oInfo4 in oInfo3.background)
  25.                 {
  26.                     //aFrames[oInfo3.attribute('id')] = { idsubsubcat: oInfo3.attribute('id') , thumbnail: oInfo4.attribute('thumbnail') };
  27.                     aBackgrounds[k] = { idcat: aFrames[k]['idcat'], idsubcat: aFrames[k]['idsubcat'] , idsubsubcat: aFrames[k]['idsubsubcat'] , thumbnail: oInfo4.attribute('thumbnail'), image: oInfo4.attribute('image') };
  28.                     k++;
  29.                 }                
  30.                 j++;
  31.             }
  32.             //aChildSubCategory[oInfo2.attribute('id')] = { id: oInfo2.sub_subcat.attribute('id'), name: oInfo2.sub_subcat.attribute('name') };
  33.             i++;
  34.         }
  35.     }    
  36. }

o lo siguiente

Código as:
Ver original
  1. function onXmlInfoComplete(event:Event) {
  2.     var oInicial:XMLList;
  3.     trace("En Xml complete");
  4.     oSettingsXml = XML(event.target.data);
  5.     //trace(oSettingsXml);
  6.     //oInicial = oSettingsXml.cats;
  7.     i = 0;
  8.     j = 0;
  9.     k = 0;        
  10.     //aCat, aSubCat y aSubSubCat son arrays
  11.     //Categories
  12.     for(i = 0; i < oSettingsXml.cat.length(); i ++ ) {
  13.         aCat[i] = { id:oSettingsXml.cat[i].attribute('id'), name:oSettingsXml.cat[i].attribute('name') };
  14.     }
  15.     //Subcategories
  16.     for (i = 0; i < oSettingsXml.cat.subcat.length(); i ++ ) {
  17.         //Increment j to assign the correct aCat
  18.         if ( i > 0 && oSettingsXml.cat.subcat[i].attribute('id') == 1 ) {
  19.             j = j + 1;
  20.         }
  21.         aSubCat[i] = { idcat: aCat[j]['id'], id:oSettingsXml.cat.subcat[i].attribute('id'), name:oSettingsXml.cat.subcat[i].attribute('name') };
  22.         //trace("aSubcat" + aSubCat[i]['idcat']);
  23.         //trace("aSubcat" + aSubCat[i]['id']);
  24.         //trace("aSubcat" + aSubCat[i]['name']);
  25.         //trace("PROBANDOOOOO " + oSettingsXml.cat.subcat.sub_subcat);
  26.     }
  27.     j = 0;
  28.     for (i = 0; i < oSettingsXml.cat.subcat.sub_subcat.length(); i ++ ) {
  29.         //Increment j to assign the correct aCat
  30.         if ( i > 0 && oSettingsXml.cat.subcat.sub_subcat[i].attribute('id') == 1 ) {
  31.             j = j + 1;
  32.         }
  33.        
  34.         aSubSubCat[i] = { idcat: 0, idsubcat: aSubCat[j]['id'], id: oSettingsXml.cat.subcat.sub_subcat[i].attribute('id'), name: oSettingsXml.cat.subcat.sub_subcat[i].attribute('name') };
  35.        
  36.  
  37.         trace("aSubcat IDCAT " + aSubSubCat[i]['idcat']);
  38.         trace("aSubcat IDSUBCAT " + aSubSubCat[i]['idsubcat']);
  39.         trace("aSubcat" + aSubSubCat[i]['id']);
  40.         trace("aSubcat" + aSubSubCat[i]['name']);
  41.     }

En ambos casos, lo que hago es recorrer el xml por cada uno de sus ramas y crear arrays para cada sección (categorias, subcategorias, subsubcategorias) y pues en primera medida me parece que no es optimo pues como podran ver estoy repitiendo en todos los arrays los id de la categoria y subcategoria pues para luego poder filtrar cuando use los arrays en otras partes de la aplicación, pero no he podido encontrar el modo de hacer el array final (el que contiene los frames , backgrounds e images de cada subsubcategoria)

Entonces tengo varias preguntas

1. Hay un modo de hacer el filtro que estoy haciendo de una mejor manera?
2. Es mejor cambiar la estructura del xml? y de ser así, cual sería una mejor estructura que me traiga los mismos datos?
Agradezco sus sugerencias
Saludos
  #2 (permalink)  
Antiguo 30/09/2009, 09:58
Avatar de SinguerInc  
Fecha de Ingreso: octubre-2007
Ubicación: Barcelona, España
Mensajes: 551
Antigüedad: 16 años, 6 meses
Puntos: 5
Respuesta: Trabajar xml en flash

Nop, siento decirlo pero ese modo es horrible. AS3 incorpora soporte para expresiones EAX, por lo tanto, tu vida se hará mucho más sencilla con ellas.

Por ejemplo, para recuperar el título de una categoría basta escribir:

var myXML:XML = XML(event.target.data);

trace(myXML.cat.(@id=="2").@name); //Tarjetas y Sobre Lord

o, por ejemplo, para la info de la cat 2 te guardas en una variable:

var cat2_xml:XML = myXML.cat.(@id=="2")[0];

y luego puedes recuperar por ejemplo, un background del siguiente modo:

trace(cat2_xml.sub_subcat.(@id==2).background.@thu mbnail);

claro que esto lo debes hacer con variables dinámicas, para recuperar varios datos, de modo que el @id==2 lo deberias cambiar por un "i" en un for por ejemplo.
O mejor aun, utilizando el nuevo "for each" de as3, y ejecutar algo como:

for each( var node:XML in myXML.cat)
{
trace(node.@name);
}

Saludos!
__________________
/blog.singuerinc.com
  #3 (permalink)  
Antiguo 30/09/2009, 11:04
Avatar de Rubil  
Fecha de Ingreso: octubre-2008
Mensajes: 23
Antigüedad: 15 años, 6 meses
Puntos: 0
Respuesta: Trabajar xml en flash

eso quiere decir que se complico la vida porque no mejor pones un ejemplo
  #4 (permalink)  
Antiguo 30/09/2009, 22:12
Avatar de mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.805
Antigüedad: 14 años, 7 meses
Puntos: 214
Respuesta: Trabajar xml en flash

Hola
Probe lo que me comentaste y me funcionan los traces a excepción de este
Código as:
Ver original
  1. trace(cat2_xml.sub_subcat.(@id==2).background.@thumbnail);
Eso por un lado

Por el otro, bueno, he estado haciendo pruebas y leyendo y me encontre
con los objetos XMLList, y haciendo una combinación entre estos y los XML he
logrado lo que necesitaba, se acorto bastante el código cosa que me alegra
sobremanera, y lo maneje finalmente con los foreach, aquí dejo lo que tengo actualmente

Código as:
Ver original
  1. var test:XMLList = oSettingsXml.cat;
  2.     for each( var node:XML in test)
  3.     {
  4.         trace("NODO " + node.@name);
  5.         var test2:XMLList = oSettingsXml.cat.(@id == node.@id).subcat;
  6.         for each (var node2:XML in test2) {
  7.             trace("NODO2 " + node2.@name);
  8.             var test3:XMLList = oSettingsXml.cat.(@id == node.@id).subcat.(@id == node2.@id).sub_subcat;
  9.             for each(var node3:XML in test3) {
  10.                 trace("NODO 3 " + node3.@name);
  11.                 var test4:XMLList = oSettingsXml.cat.(@id == node.@id).subcat.(@id == node2.@id).sub_subcat.(@id == node3.@id).frame;
  12.                 for each(var node4:XML in test4) {
  13.                     trace("NODO 4 " + node4.@thumbnail);
  14.                 }    
  15.             }
  16.         }
  17.     }

Gracias por el aporte, saludos.

Última edición por mortiprogramador; 30/09/2009 a las 22:13 Razón: agregar tag
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:00.