Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Логика XML во Flash (http://www.flasher.ru/forum/showthread.php?t=102130)

chingachgoog 09.10.2007 18:03

Цитата:

Сообщение от __etc
Полный код, пожалуйста.
Потому как я не понял, как решится проблема с nodeValue:

Я отвечал на код Ведьмака в посте 6
Код:

while (XMLmenu.firstChild.childNodes[i]) {
Он прервется, если попадется текстовый узел

А если код как у Mnilionic
Код:

var node = xml.firstChild.firstChild;
while(node){
        trace("значение: " + node.firstChild.nodeValue);
        node = node.nextSibling;

То конечно будет полный обход

add

Цитата:

Сообщение от __etc
А вот заодно тест...
Даже со всеми оптимизациями обычный перебор через for медленее в полтора с лишним раза.

C оптимизацией будет так:

Код:

for (node = xml.firstChild.firstChild; node; node = node.nextSibling) {
Собственно об этом Гурский и писал.

etc 09.10.2007 18:13

Хм.

Код:

var str = "<block><item>1</item><![CDATA[2]]><item>3</item></block>";
var xml = new XML();
xml.ignoreWhite = true;
xml.parseXML(str);

var node = xml.firstChild.firstChild;
while (node) {
        trace("A: "+(node.nodeValue || node.firstChild.nodeValue));
        node = node.nextSibling;
}
i = 0;
while (xml.firstChild.childNodes[i]) {
        node = xml.firstChild.childNodes[i];
        trace("B: "+(node.nodeValue || node.firstChild.nodeValue));
        i++;       
}

А for-таки медленнее.

chingachgoog 09.10.2007 18:18

А где тут for?

если это у вас
Код:

i = 0;
while (xml.firstChild.childNodes[i]) {
        node = xml.firstChild.childNodes[i];
        trace("B: "+(node.nodeValue || node.firstChild.nodeValue));
        i++;

то см. оптимизацию выше.

etc 09.10.2007 18:25

Так, стоп. Я отвечал насчет поста Ведьмака про текстовый тег. Никуда ничего не прерывается.

chingachgoog 09.10.2007 18:32

Значит в хелпе ошибка?
Цитата:

This property [XML.childNodes] is undefined for text nodes (nodeType == 3).

etc 09.10.2007 18:36

Цикл не прервется, просто трейс в коде Ведьмака выдаст undefined на текстовом ноде и все. Если надо получить значение нода или его ребенка, то пример я написал выше.

chingachgoog 09.10.2007 18:39

В том-то и дело, если бы выдало undefined, то цикл прервался бы, но undefined не выдается.
Видимо в хелпе имелось ввиду, что у самого текстового узла, если к нему (к текстовому узлу) применить childNodes, будет выдаваться undefned.

За пример спасибо, такого я еще не встречал:
Код:

a=234
b=undefined

trace(a || b)

Почему-то был уверен, что должна выдаваться булевая величина, ан нет...

etc 09.10.2007 18:43

Нет, в коде Ведьмака трейсится childNodes текущего нода. А в цикле идет перебор childNodes родителя. Никакой ошибки в хелпе и в коде нет.

chingachgoog 09.10.2007 18:49

Код:

var str = "<block><item>1</item><![CDATA[2]]><item>3</item></block>";
var xml = new XML();
xml.ignoreWhite = true;
xml.parseXML(str);

var node = xml.firstChild.firstChild;

i = 0;
while (xml.firstChild.childNodes[i]) {
        trace(xml.firstChild.childNodes[i].nodeType+" "+xml.firstChild.childNodes[i])
        node = xml.firstChild.childNodes[i];
        //trace("B: "+(node.nodeValue || node.firstChild.nodeValue));
        i++;       
}

Трейсит:

1 <item>1</item>
3 2
1 <item>3</item>

Т.е. при типе узла 3 (текстовый) он ни разу не undefined

а вот тут
Код:

var str = "<block><item>1</item><![CDATA[2]]><item>3</item></block>";
var xml = new XML();
xml.ignoreWhite = true;
xml.parseXML(str);


        trace(xml.firstChild.childNodes[1].childNodes[0])

Как раз undefined.

etc 09.10.2007 18:56

Ну и что ты хотел этим сказать? :)
Все работает ровно так, как должно.


Часовой пояс GMT +4, время: 01:14.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.