Leer último nodo XML. AS2
Hola todos.
tengo un pequeño problema con un flash que lee un xml.
Se trata de una animacíon que carga news de un xml y como las nuevas noticias se ponen al final de este archivo xml necesitaría empezar a leer de el último nodo.
Es posible hacerlo? no entiendo donde modificar exactamente el codigo... investingando en internet he incontrado una solucion donde pero habla de leer el último ID y poninan
longitud = tu_objetoXML.firstChild.childNodes.length;
tu_objetoXML.firstChild.childNodes[longitud-1].attributes.id;
Ahora mismo cargo el xml para luego definir los nodos...fecha noticia...
var mainNews:XML = new XML();
mainNews.ignoreWhite = true;
mainNews.onLoad = buildnews;
mainNews.load("news.xml"+getSkipCacheString());
function buildnews(success:Boolean):Void {
if (success) {
var allNews:XMLNode = mainNews.firstChild;
var allNewsTotal:Number = allNews.childNodes.length;
//var newsTitle:MovieClip = scope.attachMovie("title", "title", 501);
newsTitle._x = 35;
newsTitle._y = 20;
fade(newsTitle, 0, 100, 1.9, Strong.easeOut);
var topMask:MovieClip = scope.attachMovie("mask", "topMask", 500);
topMask._x = -167;
topMask._y = -55;
news.setMask(topMask);
var i:Number;
for (i=0; i<allNewsTotal; i++) {
var newsItem:MovieClip = news.attachMovie("newsItem", "newsItem"+i, i);
// get xml info
newsItem.nDay = allNews.childNodes[i].childNodes[0].attributes.day;
newsItem.nMonth = allNews.childNodes[i].childNodes[0].attributes.month;
newsItem.nYear = allNews.childNodes[i].childNodes[0].attributes.year;
newsItem.nTitle = allNews.childNodes[i].childNodes[1].firstChild.nodeValue;
newsItem.des = allNews.childNodes[i].childNodes[2].firstChild.nodeValue;
newsItem.iTitle.iText.text = newsItem.nTitle;
newsItem.sDes.sText.html = true
newsItem.sDes.sText.htmlText = newsItem.des;
newsItem.sDes.sText.autoSize = true;
newsItem.nDate.nDay.text = newsItem.nDay;
newsItem.nDate.nMonth.text = newsItem.nMonth;
newsItem.nDate.nYear.text = newsItem.nYear;
muchas gracias.
marco_sansa
pues no se como lo has arreglado pero .... funciona!!!!!! :D
MUCHISIMAS GRACIAS!!!!!
codebites
aix, espera, creo que puede ser esto que me he dejado, dentro del for, sustituye:
var newsItem:MovieClip = news.attachMovie("newsItem", "newsItem"+i, i);
por:
var newsItem:MovieClip = news.attachMovie("newsItem", "newsItem"+pos, pos);
a ver si funciona!
marco_sansa
Hola ! muchisimas gracias por tu respuesta....
he mirado tu codigo... parece que llama la ultima noticia lo que pasa que no se posicionan bien....
los que queda de codigo es este ...y son los botones
olderBtn.onRelease = function():Void {
if (id>=0 && id<allNewsTotal-noItems) {
stopQuick(this);
newerBtn._alpha = 100;
newerBtn.enabled = true;
var a:Number = id+noItems;
slide(news, news._y, news._y-scope.news['newsItem'+id]._height-itemSpacing, 0.7, "_y");
fade(scope.news['newsItem'+id], 100, 0, 2.2, Strong.easeOut);
fade(scope.news['newsItem'+a], 0, 100, 1.5, Strong.easeInOut);
if (id == 0) {
colorChange(newerBtn.txt, disableColor, normalColor, 1);
}
id++;
}
if (id == allNewsTotal-noItems) {
this.enabled = false;
this._alpha = 50;
slide(this.plus, 0, 4, 0.5, "_y");
}
};
olderBtn.onRollOver = function():Void {
slide(this.plus, 10, 4, 0.5, "_y");
fade(this.plus, 0, 100, 1, Strong.easeOut);
};
olderBtn.onRollOut = function():Void {
slide(this.plus, 4, 10, 0.5, "_y");
fade(this.plus, 100, 0, 1, Strong.easeOut);
};
newerBtn.onRelease = function():Void {
if (id<allNewsTotal && id>0) {
stopQuick(this);
olderBtn._alpha = 100;
olderBtn.enabled = true;
var b:Number = id-1;
var c:Number = id+noItems-1;
slide(news, news._y, news._y+scope.news['newsItem'+b]._height+itemSpacing, 0.7, "_y");
fade(scope.news['newsItem'+b], 0, 100, 1.5, Strong.easeInOut);
fade(scope.news['newsItem'+c], 100, 0, 1.2, Strong.easeOut);
id--;
}
if (id == allNewsTotal-(noItems+1)) {
colorChange(olderBtn.txt, disableColor, normalColor, 1);
}
if (id == 0) {
this.enabled = false;
this._alpha = 50;
slide(this.minus, 0, 4, 0.5, "_y");
}
};
newerBtn.onRollOver = function():Void {
slide(this.minus, 10, 5, 0.5, "_y");
fade(this.minus, 0, 100, 1, Strong.easeOut);
};
newerBtn.onRollOut = function():Void {
slide(this.minus, 5, 10, 0.5, "_y");
fade(this.minus, 100, 0, 1, Strong.easeOut);
};
} else {
trace("XML NOT LOADED");
}
}
function stopQuick(button) {
time = getTimer();
scope.onEnterFrame = function() {
time2 = getTimer();
if (Number(time2-time)>500) {
button.enabled = true;
delete scope.onEnterFrame;
} else {
button.enabled = false;
}
};
}
// tween functions
function fade(who:MovieClip, startvalue:Number, endvalue:Number, fade_speed:Number, ease) {
var fader:Tween = new Tween(who, "_alpha", ease, startvalue, endvalue, fade_speed, true);
}
function slide(who:MovieClip, startvalue:Number, endvalue:Number, y_speed:Number, prop:String) {
var slider:Tween = new Tween(who, prop, Strong.easeInOut, startvalue, endvalue, y_speed, true);
}
aparecen uno encima del otro creo también por eso :(
slide(news, news._y, news._y-scope.news['newsItem'+id]._height-itemSpacing, 0.7, "_y");
xq claro posiciono los clips como antes pero llamo las noticias de otra manera ... ¿verdad?
gracias...
codebites
hola Barna_08,
veo que la cosa tiene su miga, no me he podido recrear mucho en el código de los botones, pero centrándome en el bucle, he visto que hay una "ordenación" y posicionamiento basándose en la i del bucle, así que si en vez de avanzar de 0 a n lo hacemos al revés, probablemente se vaya algo al traste, prueba sustituir lo del for por esto, fijate que antes del for uso una variable "pos" a modo de cursor, y que dentro de bucle he cambiado todas las referencias a i (excepto las que recuperan la noticia del xml) por pos, luego incremento pos al final del bucle pos++, he probado el bucle tal como lo he puesto y al menos puedo trazar las noticias del reves, a ver si funciona:
var pos= 0;
for (i=allNewsTotal-1; i>=0; i--) {
trace("-------");
trace(allNews.childNodes[i]);
var newsItem:MovieClip = news.attachMovie("newsItem", "newsItem"+i, i);
// get xml info
newsItem.nDay = allNews.childNodes[i].childNodes[0].attributes.day;
newsItem.nMonth = allNews.childNodes[i].childNodes[0].attributes.month;
newsItem.nYear = allNews.childNodes[i].childNodes[0].attributes.year;
newsItem.nTitle = allNews.childNodes[i].childNodes[1].firstChild.nodeValue;
newsItem.des = allNews.childNodes[i].childNodes[2].firstChild.nodeValue;
newsItem.iTitle.iText.text = newsItem.nTitle;
newsItem.sDes.sText.html = true;
newsItem.sDes.sText.htmlText = newsItem.des;
newsItem.sDes.sText.autoSize = true;
newsItem.nDate.nDay.text = newsItem.nDay;
newsItem.nDate.nMonth.text = newsItem.nMonth;
newsItem.nDate.nYear.text = newsItem.nYear;
// intro for newsItem + positioning
newsItem._x = 0;
newsItem.pos = scope.news['newsItem'+(pos-1)]._y+scope.news['newsItem'+(pos-1)]._height+itemSpacing;
newsItem._y = newsItem.pos;
if (pos<noItems) {
// show the first news items
fade(newsItem,0,100,introSpeed+pos*0.6,Strong.easeInOut);
} else {
// hide other itmes
newsItem._alpha = 0;
}
pos++;
}
marco_sansa
Hola gracias por la respuesta....
eso es todo el codigo yo creo que es donde está el "for" pero no consigo la solución...
var introSpeed:Number = 0.9;
var itemSpacing:Number = 12;
// Number of items to show at any one time
var noItems:Number = 2;
import mx.transitions.Tween;
import mx.transitions.easing.*;
// used to stop the caching of xml
#include "com/cache/skipCache.as"
scope = this;
scope.createEmptyMovieClip("news", 400);
news._x = -167;
news._y = -55;
var id:Number = 0;
var newsNav:MovieClip = scope.createEmptyMovieClip("newsNav", 600);
newsNav._x = 370;
newsNav._y = 270;
fade(newsNav, 0, 100, 1.6, Strong.easeOut);
var olderBtn:MovieClip = newsNav.attachMovie("oldBtn", "oldBtn", 602);
olderBtn.txt.t.text = "AVANTI";
olderBtn._x = -145;
olderBtn._y = -86;
var newerBtn:MovieClip = newsNav.attachMovie("newBtn", "newBtn", 601);
newerBtn.txt.t.text = "INDIETRO";
newerBtn._x = -230;
newerBtn._y = -86;
newerBtn._alpha = 50;
colorChange(newerBtn.txt, activeColor, disableColor, 0.1);
newerBtn.enabled = false;
// Load XML
var mainNews:XML = new XML();
mainNews.ignoreWhite = true;
mainNews.onLoad = buildnews;
mainNews.load("news.xml"+getSkipCacheString());
function buildnews(success:Boolean):Void {
if (success) {
var allNews:XMLNode = mainNews.firstChild;
var allNewsTotal:Number = allNews.childNodes.length;
//var newsTitle:MovieClip = scope.attachMovie("title", "title", 501);
newsTitle._x = 35;
newsTitle._y = 20;
fade(newsTitle, 0, 100, 1.9, Strong.easeOut);
var topMask:MovieClip = scope.attachMovie("mask", "topMask", 500);
topMask._x = -167;
topMask._y = -55;
news.setMask(topMask);
var i:Number;
for (i=0; i<allNewsTotal; i++) {
var newsItem:MovieClip = news.attachMovie("newsItem", "newsItem"+i, i);
// get xml info
newsItem.nDay = allNews.childNodes[i].childNodes[0].attributes.day;
newsItem.nMonth = allNews.childNodes[i].childNodes[0].attributes.month;
newsItem.nYear = allNews.childNodes[i].childNodes[0].attributes.year;
newsItem.nTitle = allNews.childNodes[i].childNodes[1].firstChild.nodeValue;
newsItem.des = allNews.childNodes[i].childNodes[2].firstChild.nodeValue;
newsItem.iTitle.iText.text = newsItem.nTitle;
newsItem.sDes.sText.html = true
newsItem.sDes.sText.htmlText = newsItem.des;
newsItem.sDes.sText.autoSize = true;
newsItem.nDate.nDay.text = newsItem.nDay;
newsItem.nDate.nMonth.text = newsItem.nMonth;
newsItem.nDate.nYear.text = newsItem.nYear;
// intro for newsItem + positioning
newsItem._x = 0;
newsItem.pos = scope.news['newsItem'+(i-1)]._y+scope.news['newsItem'+(i-1)]._height+itemSpacing;
newsItem._y = newsItem.pos;
if (i<noItems) {
// show the first news items
fade(newsItem, 0, 100, introSpeed+i*0.6, Strong.easeInOut);
} else {
// hide other itmes
newsItem._alpha = 0;
}
}
olderBtn.onRelease = function():Void {
if (id>=0 && id<allNewsTotal-noItems) {
stopQuick(this);
newerBtn._alpha = 100;
newerBtn.enabled = true;
var a:Number = id+noItems;
slide(news, news._y, news._y-scope.news['newsItem'+id]._height-itemSpacing, 0.7, "_y");
fade(scope.news['newsItem'+id], 100, 0, 2.2, Strong.easeOut);
fade(scope.news['newsItem'+a], 0, 100, 1.5, Strong.easeInOut);
if (id == 0) {
colorChange(newerBtn.txt, disableColor, normalColor, 1);
}
id++;
}
if (id == allNewsTotal-noItems) {
this.enabled = false;
this._alpha = 50;
slide(this.plus, 0, 4, 0.5, "_y");
}
};
olderBtn.onRollOver = function():Void {
slide(this.plus, 10, 4, 0.5, "_y");
fade(this.plus, 0, 100, 1, Strong.easeOut);
};
olderBtn.onRollOut = function():Void {
slide(this.plus, 4, 10, 0.5, "_y");
fade(this.plus, 100, 0, 1, Strong.easeOut);
};
newerBtn.onRelease = function():Void {
if (id<allNewsTotal && id>0) {
stopQuick(this);
olderBtn._alpha = 100;
olderBtn.enabled = true;
var b:Number = id-1;
var c:Number = id+noItems-1;
slide(news, news._y, news._y+scope.news['newsItem'+b]._height+itemSpacing, 0.7, "_y");
fade(scope.news['newsItem'+b], 0, 100, 1.5, Strong.easeInOut);
fade(scope.news['newsItem'+c], 100, 0, 1.2, Strong.easeOut);
id--;
}
if (id == allNewsTotal-(noItems+1)) {
colorChange(olderBtn.txt, disableColor, normalColor, 1);
}
if (id == 0) {
this.enabled = false;
this._alpha = 50;
slide(this.minus, 0, 4, 0.5, "_y");
}
};
newerBtn.onRollOver = function():Void {
slide(this.minus, 10, 5, 0.5, "_y");
fade(this.minus, 0, 100, 1, Strong.easeOut);
};
newerBtn.onRollOut = function():Void {
slide(this.minus, 5, 10, 0.5, "_y");
fade(this.minus, 100, 0, 1, Strong.easeOut);
};
} else {
trace("XML NOT LOADED");
}
}
function stopQuick(button) {
time = getTimer();
scope.onEnterFrame = function() {
time2 = getTimer();
if (Number(time2-time)>500) {
button.enabled = true;
delete scope.onEnterFrame;
} else {
button.enabled = false;
}
};
}
// tween functions
function fade(who:MovieClip, startvalue:Number, endvalue:Number, fade_speed:Number, ease) {
var fader:Tween = new Tween(who, "_alpha", ease, startvalue, endvalue, fade_speed, true);
}
function slide(who:MovieClip, startvalue:Number, endvalue:Number, y_speed:Number, prop:String) {
var slider:Tween = new Tween(who, prop, Strong.easeInOut, startvalue, endvalue, y_speed, true);
}
y ese el xml con una noticia por ejemplo
<item>
<date day="28" month="MAY" year="2009"/>
<title>Titulo</title>
<description>Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam era onsequat ut laoreet dolore magna aliquam era onsequat ut laoreet dolore magna aliquam era onsequat ut laoreet dolore magna aliquam era onsequat</description>
</item>
muchas gracias.
codebites
Hola, ui, la verdad es que me he puesto a escribir de memoria... me puedes dar más detalles?
mí código es el que da el error o es el que monta las noticias una encima de otra? podría ver como se muestran las noticias, en este código no veo donde se le indica la posición ._y a cada newItem
marco_sansa
Hola! muchas gracias ...
acabo de comprobar este codigo y no funciona ... es decir yo he intentado también poniendo
for (i:Number=allNewsTotal;i=0;i--){
pero me sale un error del player (como script corrupto algo así)....
mientras con este tuyo no va.... las dos noticias se veen las dos una encima de la otra. ....
codebites
hola,
prueba invirtiendo el loop, en vez de ir de 0 al tamaño del array, vamos del tamaño del array (length-1, los arrays siempre suman uno al total de sus elementos) a 0
for (i=allNewsTotal-1; i>-1; i--) {
A ver si funciona, saludos