PDA

Volledige versie bekijken : xml probleem


xtr0
%Europe/Berlin %701 %2006, 17:50
Hey flashers,
Ik ben bezig met een full-flash website alleen ik loop nu tegen een probleem aan bij de news-swf. Ik wil via xml de news-items inladen, zodat ik deze makkelijk en snel kan aanpassen. Alleen ik heb nu een heel raar probleem, vooral omdat het bij een andere swf wel werkt:
Op het 1e frame heb ik deze code:

Stage.showMenu = false;
var newsXML:XML = new XML();
var titles:Array = new Array();
var dates:Array = new Array();
var info:Array = new Array();
newsXML.ignoreWhite = true;
newsXML.onLoad = function(succes) {
if (succes) {
var lengte:Array = this.firstChild.childNodes;
for (i=0; i<lengte.length; i++) {
titles.push(this.firstChild.childNodes[i].attributes.title);
dates.push(this.firstChild.childNodes[i].attributes.date);
info.push(this.firstChild.childNodes[i].attributes.info);
trace("binnen:" + titles);
}
}
};
newsXML.load("news.xml");
Hiermee laad ik de xml in, en plaats ik de informatie in 3 arrays. Als ik binnen deze functie de titles array trace, zie ik inderdaad dat er steeds iets bij geschreven wordt. Op het 2e frame heb ik dit staan:
stop();
trace("buiten:" + titles);
In het trace scherm staat dit na het testen:
buiten:
binnen:Newsitem1
binnen:Newsitem1,Newsitem2
binnen:Newsitem1,Newsitem2,Newsitem3
binnen:Newsitem1,Newsitem2,Newsitem3,Newsitem4
buiten de functie is de array dus opeens weer leeg. Dit is de xml:
<?xml version="1.0" encoding="iso-8859-1"?>
<news>
<item title="Newsitem1" date="14/06/2006" info="newsitem1"/>
<item title="Newsitem2" date="14/06/2006" info="newsitem2"/>
<item title="Newsitem3" date="14/06/2006" info="newsitem3"/>
<item title="Newsitem4" date="14/06/2006" info="newsitem4"/>
</news>
Hoe komt het, dat de array opeens weer leeg is?
Degene die helpen zal ik zeker belonen met reputatie punten.;)
Alvast bedankt!

Emveedee
%Europe/Berlin %708 %2006, 18:00
Dit klopt.
Als je xml inlaad moet je binnen je load functie
de andere functies aanroepen die die info nodig hebben.
Hij voert namelijk al tijdens het laden van je xml die functies uit ;)

xtr0
%Europe/Berlin %713 %2006, 18:07
dus dan moet ik het zo doen:
Stage.showMenu = false;
var newsXML:XML = new XML();
var titles:Array = new Array();
var dates:Array = new Array();
var info:Array = new Array();
newsXML.ignoreWhite = true;
newsXML.onLoad = function(succes) {
if (succes) {
var lengte:Array = this.firstChild.childNodes;
for (i=0; i<lengte.length; i++) {
if(i<lengte.length - 1){
titles.push(this.firstChild.childNodes[i].attributes.title);
dates.push(this.firstChild.childNodes[i].attributes.date);
info.push(this.firstChild.childNodes[i].attributes.info);
trace("binnen:" + titles);
} else {
titles.push(this.firstChild.childNodes[i].attributes.title);
dates.push(this.firstChild.childNodes[i].attributes.date);
info.push(this.firstChild.childNodes[i].attributes.info);
deFuntie(titles,dates,info);
}
}
}
};
newsXML.load("news.xml");

test het na het eten ;), bedankt voor je reactie

Emveedee
%Europe/Berlin %717 %2006, 18:13
Nee ;)

zo:

Stage.showMenu = false;
var newsXML:XML = new XML();
var titles:Array = new Array();
var dates:Array = new Array();
var info:Array = new Array();
newsXML.ignoreWhite = true;
newsXML.onLoad = function(succes) {
if (succes) {
var lengte:Array = this.firstChild.childNodes;
for (i=0; i<lengte.length; i++) {
titles.push(this.firstChild.childNodes[i].attributes.title);
dates.push(this.firstChild.childNodes[i].attributes.date);
info.push(this.firstChild.childNodes[i].attributes.info);
trace("binnen:" + titles);
}
deFunctie(titles, dates, info);
}
};
newsXML.load("news.xml");

succes!

xtr0
%Europe/Berlin %750 %2006, 19:01
hey,
Het werkt!
Harstikke bedankt!
Alleen bij de main swf (waar alle andere swf's worden ingeladen), doet hij dit wel gewoon op die andere manier. Raar dat ie dat hier opeens niet deed...
Nogmaals bedankt!

Emveedee
%Europe/Berlin %769 %2006, 19:28
Graag gedaan :)

xtr0
%Europe/Berlin %513 %2006, 13:19
pfff het lukt nog steeds niet :(...
heb nu deze functie die de items plaatst:
var aantal:Number = new Number();
function bouwItems(titleArray, datesArray, infoArray){
aantal = titleArray.length;
for (i=0; i<aantal; i++){
var t = newsHolder.attachMovie("item","item"+i,i);
t._x = 0;
t._y = 130 * i;
t.title.text = titleArray[i];
t.date.text = datesArray[i];
t.info.text = infoArray[i];
var l = newsHolder.attachMovie("lijn","lijn"+i,aantal+i);
l._x = 0;
l._y = 120 + 120 * i;
}
}
deze functie wordt in de xml-functie aangeroepen:
var newsXML:XML = new XML();
var titles:Array = new Array();
var dates:Array = new Array();
var info:Array = new Array();
newsXML.ignoreWhite = true;
newsXML.onLoad = function(succes) {
if (succes) {
var lengte:Array = this.firstChild.childNodes;
for (i=0; i<lengte.length; i++) {
titles.push(this.firstChild.childNodes[i].attributes.title);
dates.push(this.firstChild.childNodes[i].attributes.date);
info.push(this.firstChild.childNodes[i].attributes.info);
}
bouwItems(titles, dates, info);
}
};
newsXML.load("news.xml");
als ik aantal nu buiten functie trace, krijg ik nog steeds 0...
Hoe krijg ik aantal zo, dat ik hem later nog kan gebruiken?
Ik heb al "return aantal;" aan het einde van functie bouwItems geprobeerd, maar dit werkt niet. Ik weet wel zeker dat de functie wordt gebruikt, want de hij attached gewoon alles zoals het hoort.
Alvast bedankt!

Emveedee
%Europe/Berlin %627 %2006, 16:03
Probeer dit eens?

var aantal:Number = 0;
function bouwItems(titleArray, datesArray, infoArray){
for (i=0; i<titleArray.length; i++){
var t = newsHolder.attachMovie("item","item"+i,i);
t._x = 0;
t._y = 130 * i;
t.title.text = titleArray[i];
t.date.text = datesArray[i];
t.info.text = infoArray[i];
var l = newsHolder.attachMovie("lijn","lijn"+i,aantal+i);
l._x = 0;
l._y = 120 + 120 * i;
aantal++;
}
}

xtr0
%Europe/Berlin %638 %2006, 16:19
hmm nee sorry werkt ook niet :(, hij attached de 1e movieclip zelfs niet meer...
heb ook al aantal = i; geprobeerd maar dat werkt ook niet :(. Iig bedankt voor je hulp.

Dauntless
%Europe/Berlin %642 %2006, 16:25
De variabele 'aantal' heeft pas z'n echte waarde nadat de onLoad + bouwItems opgeroepen is. Als je deze buiten de functie traced gaat hij 0 geven omdat de onLoad nog niet uitgevoerd is.

Emveedee
%Europe/Berlin %650 %2006, 16:37
Maar hoe moet je m dan wel daarna weergeven?

zo misschien ? (lijkt me nogal omslachtig):

var newsXML:XML = new XML();
var titles:Array = new Array();
var dates:Array = new Array();
var info:Array = new Array();
var loaded:Boolean = false;
newsXML.ignoreWhite = true;
newsXML.onLoad = function(succes) {
if (succes) {
var lengte:Array = this.firstChild.childNodes;
for (i=0; i<lengte.length; i++) {
titles.push(this.firstChild.childNodes[i].attributes.title);
dates.push(this.firstChild.childNodes[i].attributes.date);
info.push(this.firstChild.childNodes[i].attributes.info);
}
bouwItems(titles, dates, info);
loaded = true; // variabele op true zetten in onload
}
};
newsXML.load("news.xml");

//blijven proberen totdat ie geladen is?
this.onEnterFrame = function(){
if(loaded){
trace(aantal);
delete this.onEnterFrame;
}
}

xtr0
%Europe/Berlin %651 %2006, 16:38
hmm maar ik trace hem op het 2e frame, terwijl die functies op het 1e scherm staan. Dan zijn die acties toch al uitgevoerd?

Dauntless
%Europe/Berlin %652 %2006, 16:39
Niet persé... Stel je voor dat je een xml inlaadt van 50mb... Dat gaat heus niet op 1 frame ingeladen zijn ...

preat
%Europe/Berlin %688 %2006, 17:31
onderaan je frame doe je stop();

in je onLoad() blablba dan gotoAndPlay(2); ^^

xtr0
%Europe/Berlin %691 %2006, 17:35
het werkt harstikke bedankt allemaal :D