Piotr Danielewicz

Piotr Danielewicz front-end developer,
Media 4 U

Temat: [AS3] Rekurencja i XML

Czołem.
Mam problem z rekurencją podczas czytania xmla. Jak dedukuję to coś zrąbałem ;)
Dlatego prosiłbym Was o pomoc, ew. o podpowiedź jaka inną ścieżkę obrać.

Teraz XML:

<dane>
<katalog nazwa="katalog produktów">
<wpis nazwa="main 1">
<wpis nazwa="sub 1" znaczek="">
<wpis nazwa="sub sub 1" znaczek="">
<opis><![CDATA[asd fas df asdf asdf asd fas]]></opis>
</wpis>
<wpis nazwa="sub sub 1" znaczek="">
<opis><![CDATA[asd fas df asdf asdf asd fas]]></opis>
</wpis>
</wpis>
</wpis>

<wpis nazwa="main 2">
</wpis>

<wpis nazwa="main 3">
<wpis nazwa="sub 1" znaczek="">
<wpis nazwa="sub sub 1" znaczek="">
<opis><![CDATA[asd fas df asdf asdf asd fas]]></opis>
</wpis>
</wpis>
</wpis>
</katalog>
</dane>


Uprościłem nieco, ale generalnie chodzi o zagnieżdżenia.

Teraz kod AS

function xmlLoaded(e:Event):void {
xml = XML(e.target.data);
katalog = xml.katalog
drillDown(katalog)
}

function drillDown(_data:XMLList){
for(a = 0; a<_data.wpis.length(); a++){
if(_data.wpis[a].length()>0){
drillDown(_data.wpis[a].wpis)
}
}
}


Zasada działania jest prosta: do funkcji przekazuję XMLList i tam w pętli sprawdzam czy jest interesująca mnie gałąź <wpis> czy nie. jeśli jest to wiadomo, jeszcze raz wywołuję funkcję itd.
Teraz są problemy dwa
1. Skrypt mi się zawiesza ;) z powodu zbyt długiego oczekiwania i/lub mielenia
2. Jeśli już sobie pobiorę nazwy i wyświetlę je w liście to jak pobrać dane miejsce w xmlu z konkretnym zagłębieniem? Jakieś countery czy coś?

PS. Pomyślałem sobie, że zrobię tego xmla na zasadzie wpis pod wpisem i dam tylko id i parent. Wtedy nie będzie problemów.
Tak czy siak dobrze by było wiedzieć czemu nie działa ;)

Dzięki za podpowiedzi :)
Jerzy Wierzchowski

Jerzy Wierzchowski Senior Software
Developer

Temat: [AS3] Rekurencja i XML

Rekurancja jest ładna owszem ale nie radzę z niej korzystać... szczególnie we flashu który jest pamięciożerny i ma domyślnie ustawiony limit skrypty na 15 sekund. Skrypt zapewne zawiesza się ponieważ przekracza wspomniane 15 sekund lub wpadasz gdzieś w nieskończoną rekurencje. Nie dostajesz komunikatu o przepełnieniu stosu?
Rozumiem że szukasz czegoś w drzewie? Może zmień jego strukturę, uporządkuj, pogrupuj jakoś obiekty by nie sprawdzać każdego węzła.
Piotr Danielewicz

Piotr Danielewicz front-end developer,
Media 4 U

Temat: [AS3] Rekurencja i XML

Dokładnie, zawiesza się bo przekracza wspomniane przez Ciebie 15 sekund. Pewnie wyjdzie teraz mój brak doświadczenia, nie będę się z tym krył, ale to dziwne, że przy tak "prostym" xmlu się sypie.

Oczywiście jak dla mnie temat jest nadal otwarty i liczę na pomoc w postaci rozjaśnienia sytuacji i naprowadzenia na właściwy tok. Kto wie, może kiedyś mi się przyda :)

I tak, będę musiał przeorganizować delikatnie dane z xmla
Łukasz Błachowicz

Łukasz Błachowicz codziennie wymiatam
i odkurzam

Temat: [AS3] Rekurencja i XML

Zadnych petli, e4x


trace( xml..wpis.(@nazwa=="sub 1") );

jaki to dokładnie ma byc warunek ?

btw, podany przez ciebie kod tak czy inaczej wykonuje sie poprawnie.

Następna dyskusja:

[as3] pobierania tekstu z x...




Wyślij zaproszenie do