PDA

View Full Version : selectNext() problem


funky_guitarist
01-22-2008, 11:41 AM
hi everybody

i m trying to loop through a dataset:

the output of the debugger
shows
zeile2 two times.

this shoudn t be the case.

what am i doing wrong here.

any help is very welcomed




<canvas debug="true" width="1000" height="500">

<dataset name="mein_datenset" >
<wurzel>
<zeile name="zeile_1" >
<takt name="takt_1" >
<viertel name="v_1">
<note name="25_25" x="25" y="25"/>
<note name="50_25" x="50" y="25" />
</viertel>
<viertel name="v_2"/>
<viertel name="v_3">
<note name="40_40" x="40" y="40" />
</viertel>
<viertel name="v_4"/>
</takt>
<takt name="takt_2" />
</zeile>
<zeile name="zeile_2" />
</wurzel>
</dataset>

<datapointer name="mein_datenzeiger_zeile" />
<datapointer name="mein_datenzeiger_takt" />

<script>
function elemente_erstellen()
{
mein_datenzeiger_zeile.setXPath("mein_datenset:/wurzel");
mein_datenzeiger_zeile.selectChild(1);
do
{
mein_datenzeiger_takt.setXPath("mein_datenset:/wurzel/zeile[@name='"+mein_datenzeiger_zeile.getNodeAttribute('name')+"']");
mein_datenzeiger_takt.selectChild(1);
do
{
Debug.write(mein_datenzeiger_takt.getNodeAttribute ('name'));
}
while(mein_datenzeiger_takt.selectNext(1))

Debug.write(mein_datenzeiger_zeile.getNodeAttribut e('name'));
}
while(mein_datenzeiger_zeile.selectNext(1))
}
elemente_erstellen();
</script>

</canvas>

greetings

mark

senshi
01-22-2008, 12:13 PM
Hallo Mark,

die Funktion "selectChild" gibt Dir einen boolschen Rückgabewert zurück, der entweder "true" ist, falls der datapointer erfolgreich geändert werden konnte, daher falls das Kindelement angewählt werden konnte, "false" wenn dies nicht der Fall ist.
Bei der zweiten Zeile konnte ja kein Kindelement angewählt werden, da keins vorhanden ist und deshalb zeigte der datapointer immer noch direkt auf diese zweite Zeile. Daher gab es einmal eine Ausgabe in der do-while Schleife und einmal die normal Ausgabe der Zeile am Ende.

Also musst Du einfach immer nur prüfen, ob "selectChild" "true" zurückgegeben hat, bevor Du im Programm weitermachst.
(Übrigens ist es performanter, wenn "setFromPointer" benutzt wird.)

- André


function elemente_erstellen() {
mein_datenzeiger_zeile.setXPath("mein_datenset:/wurzel");
if (mein_datenzeiger_zeile.selectChild()) {
do {
mein_datenzeiger_takt.setFromPointer(mein_datenzei ger_zeile);
if (mein_datenzeiger_takt.selectChild()) {
do {
Debug.write(mein_datenzeiger_takt.getNodeAttribute ('name'));
} while(mein_datenzeiger_takt.selectNext());
}

Debug.write(mein_datenzeiger_zeile.getNodeAttribut e('name'));
} while(mein_datenzeiger_zeile.selectNext());
}
}

funky_guitarist
01-22-2008, 11:32 PM
hallo andre

tausend dank für die erklärung jetzt verstehe ich besser was da vor sich geht.

setfromPointer ist auch ein klasse hinweis.

das verstehe ich auch sofort. bin nur nie drauf gekommen es zu benutzen.

danke noch einmal
und viele grüsse


mark