Invertir orden en un loadXML con Actionscript
Muchachos, en ésta oportunidad recurro a ustedes con la siguiente duda:
Estoy cargando ciertos textos de un XML y los formateo con un css, mientras q los parseo con un .as; a continuación les dejo los códigos correspondientes:
Código en Flash
<code>
var noticiasXML = {};
var xml = new XML();
xml.ignoreWhite = true;
xml.onLoad = function (ok)
{
if (ok)
{
noticiasXML = Parsear.parsearXML(this.firstChild);
o = 1;
contenido_mc.menu_mc.texto_txt.htmlText = "";
for (h in noticiasXML)
{
++o;
} // end of for...in
for (i = 1; i < o; i++)
{
contenido_mc.menu_mc.texto_txt.htmlText = contenido_mc.menu_mc.texto_txt.htmlText + ("<span class='titulo\'>" + noticiasXML["nota" + i].titulo + "</span><br>");
contenido_mc.menu_mc.texto_txt.htmlText = contenido_mc.menu_mc.texto_txt.htmlText + ("<span class='flecha\'>" + noticiasXML["nota" + i].flecha + " " + "</span>" + "<span class='fecha\'>" + noticiasXML["nota" + i].fecha + "</span><br>");
contenido_mc.menu_mc.texto_txt.htmlText = contenido_mc.menu_mc.texto_txt.htmlText + ("<span class='flecha\'>" + noticiasXML["nota" + i].flecha + " " + "<span class='fecha\'>" + noticiasXML["nota" + i].hora + "</span><br>");
contenido_mc.menu_mc.texto_txt.htmlText = contenido_mc.menu_mc.texto_txt.htmlText + ("<span class='texto\'>" + noticiasXML["nota" + i].texto + "</span><br><br>");
} // end of for
}
else
{
trace ("fallo");
} // end else if
};
contenido_mc.menu_mc.texto_txt.htmlText = this.noticias;
var format = new TextField.StyleSheet();
var path = "includes/estilos.css";
format.load(path);
format.onLoad = function (loaded)
{
if (loaded)
{
contenido_mc.menu_mc.texto_txt.styleSheet = format;
xml.load("includes/xml/noticias.xml");
}
else
{
contenido_mc.menu_mc.texto_txt.htmlText = "Error cargando archivo CSS";
} // end else if
};</code>
Archivo Parsear.as
<code>class Parsear
{
function Parsear()
{
} // End of the function
static function parsearXML(nodo)
{
var _loc3 = {};
if (nodo.firstChild.nodeType == 3)
{
_loc3.push(nodo.firstChild.nodeValue);
}
else
{
for (var _loc1 = 0; _loc1 < nodo.childNodes.length; ++_loc1)
{
if (nodo.childNodes[_loc1].firstChild.nodeType == 3)
{
_loc3[nodo.childNodes[_loc1].nodeName] = nodo.childNodes[_loc1].firstChild.nodeValue;
continue;
} // end if
_loc3[nodo.childNodes[_loc1].nodeName] = {};
_loc3[nodo.childNodes[_loc1].nodeName] = Parsear.parsearXML(nodo.childNodes[_loc1]);
} // end of for
} // end else if
return (_loc3);
} // End of the function
} // End of Class
</code>
Hasta aquí, bárbaro, xq el texto me lo carga y me lo formatea perfectamente.
Mi duda, apunta específicamente a lo siguiente:
Necesito q me invierta el orden en el cual muestra los datos del XML; un ejemplo:
<nota1>
blablabla
</nota1>
<nota2>
blablabla
</nota2>
<nota3>
blablabla
</nota3>
Necesito q invierta el orden... En vez de mostrar 1, 2 y 3 que muestre 3, 2 y 1.
Porqué? Bien... Resulta q lo utilizo para mostrar noticias, y funcionando como funciona, siempre me agrega la nueva noticia abajo de todo (carga todas las noticias dentro del mismo campo de texto).
Si no se entendió bien, vuelvo a explicarlo. Sé q quizá sea mucho rollo de código para leer, pero me harían un gran favor si me dieran una mano con esto.
Como siempre, muchas gracias.
:)
damianmuti
Genial tu explicacion, Suricato!
Pido disculpas x no haber podido responder antes, pero estoy sin inet en casa y sólo estoy logueando desde la oficina.
Agradezco muchísimo tu impecable explicación; lo pondré en práctica y, si me surgen dudas, lo haré saber x este mismo medio.
Nuevamente muchas gracias x la ayuda :)
elSuricatoRojo
Te comento como lo hago yo...
Reconstruyo la estructura de nodo como un modelo de datos basado en objetos... algo parecido al JSON, y genero un array que actue como indice. La estructura de datos resultante sería parecida a si hiciesemos:
<code>
var data=new Object()
data.array_indice=["noticia_1", "noticia_2", "noticia_3"]
data.noticia_1=new Object()
data.noticia_1.texto="bla bla 1"
data.noticia_2=new Object()
data.noticia_2.texto="bla bla 2"
data.noticia_3=new Object()
data.noticia_3.texto="bla bla 3"
</code>
El array actua como indice y marca el orden de los subobjetos de tal forma que coincida con el orden de los nodos en el xml.
Como suelo interpretar los xml mediante "for in's" ocurre que de inicio el array_indice sale invertico con respecto al orden del documento xml (los ultimos nodo salen primero en el array). Con hacer un reverse() despues de parsear todos los nodos el array vuelve a tener el orden correcto.
Si luego quieres extraer lso datos de cada noticia en el orden del xml lo puedes hacer así:
<code>
for (var i=0; i<data.array_indice.length; i++){
var noticiaId:String = data.array_indice[i]
var datosNoticia:Object = data[noticiaId]
}
</code>
Resumiendo:
1) La forma mas facil de atacar un xml es mediante "for in's" ya que a priori no sabes cuantos nodos y subnodos hay.
2) Utiliza objetos para almacenar los datos de los nodos y arrays para almacenar el orden de los mismos.
3) Como el "for in" interpreta los xml de "abajo a arriba" tendrás que hacer un Array.reverse() para sincronizar el orden del array con el del xml.
damianmuti
Bueno, gracias x la pronta respuesta!
Olvidé comentar eso mismo... Q al utilizarlo así, como vos bien describiste, me eliminaba la primer nota cargada (la más vieja, digamos) y me agregaba una nota vacía como primer nota, x lo q había descartado la posibilidad.
Ahora bien, al haber hecho q me refrescaras la fórmula, Athomix, cambié algunas cosillas para q pudiera funcionar, por lo q el for quedaría de la siguiente manera:
<code>... // end of for...in
for (i = o-1; i > 0; i--)
</code>
Hecho!
Ahooora sí está funcionando como lo pretendía...
Evidentemente me desesperé y arme todo este thread de engorrosa lectura x sólo sumar y restar un numerillo.
Disculpas, y gracias! :)
Athomix
voy a decir una parida porque no me he mirado el còdigo pero has probado?
... // end of for...in
for (i = o; i > 1; i--)
:???: