Ver Mensaje Individual
  #1 (permalink)  
Antiguo 29/09/2009, 21:20
Avatar de mortiprogramador
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