Форум 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)

Molecula 09.10.2007 17:07

Мыкыта
Таким кодом НЕ выдасть флеш те цифры, которые стоят между тегами - Вы проверяли хоть, согласно структуре автора?
Ведьмак, автор решит, что ему ближе к сердцу :)
А вообще да, перегнул палку.

Мыкыта 09.10.2007 17:18

я всего лишь натолкнул на путь истинный, а не написал за автора то что ему надо... в первую очередь надо учится не код писать, а пользоваться справкой!

Mnilionic 09.10.2007 17:20

Код:

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

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


chingachgoog 09.10.2007 17:23

Цитата:

Сообщение от Ведьмак
Код:

while (XMLmenu.firstChild.childNodes[i])

А если узел текстовый? nodeType == 3

add

К чему эти упражнения с while? В байткоде, что while, что for - одно и тоже выходит, а конструкция надежнее:
Код:

for (i=0; i<XMLmenu.firstChild.length; i++)
 ...XMLmenu.firstChild.childNodes[i]


UnOuter 09.10.2007 17:32

Cпасибо, разобрался, очень помогли!

etc 09.10.2007 17:33

Не надежнее. Прожорливее при этом, причем в разы.

chingachgoog 09.10.2007 17:41

Цитата:

Сообщение от __etc
Не надежнее. Прожорливее при этом, причем в разы.

Так как быть с nodeType == 3? Вводить новое условие? Зачем?

Цитата:

Сообщение от Гурский
Следующие ходы, вопреки широко распространенному мнению, никак не влияют на производительность циклов:
1) Замена цикла for на цикл while. Несмотря на то, что цикл while кажется более простым, а, следовательно, и более быстрым, чем for, между ними нет никакой разницы. После компиляции они дают один и тот же байт-код.


etc 09.10.2007 17:45

Нет, твой конкретный пример прожорливее и никоим образом текстовые ноды не переваривает.

Если пример с while лишь проверяет node на null и обращается по ссылке к следующему, то твой плюсует счетчик, обращается дважды к XMLmenu.firstChild.childNodes (это нефиговая такая процедура, надо заметить), обращается к ноду по индексу (тоже нефиговая процедура, вместо ссылочного обращения), и ещё высчитывает постоянно длину массива.

А у Гурского написано про:

Код:

for (var i = 0;i < 10;i++) {}
и
Код:

var i = 0;while (i < 10) { i++; }

chingachgoog 09.10.2007 17:51

Цитата:

Сообщение от __etc
Нет, твой конкретный пример прожорливее и никоим образом текстовые ноды не переваривает.

Это почемуже он не переваривает текстовые ноды?
Он не только их переваривает, но и позволяет обратиться к следующим за текстовым нодом узлом, а в примере с while все следующее он уже не увидит.

Цитата:

Сообщение от __etc
и ещё высчитывает постоянно длину массива.

Понятно, что это надо вычислить заранее один раз.

etc 09.10.2007 17:55

Цитата:

Сообщение от chingachgoog
Это почемуже он не переваривает текстовые ноды?
Он не только их переваривает, но и позволяет обратиться к следующим за текстовым нодом узлом, а в примере с while все следующее он уже не увидит.

Полный код, пожалуйста.

Потому как я не понял, как решится проблема с nodeValue:


Код:

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

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

for (i=0; i<xml.firstChild.childNodes.length; i++) {
        node = xml.firstChild.childNodes[i];
        trace(node.firstChild.nodeValue);
}

А вот заодно тест:

Код:

var str = "<block><item>1</item><item>2</item><item>3</item></block>";
var xml = new XML();
xml.ignoreWhite = true;
xml.parseXML(str);
t = getTimer();
for (j=0; j<100000; j++) {
        node = xml.firstChild.firstChild;
        while (node) {
                node = node.nextSibling;
        }
}
trace(getTimer()-t); // 1028
t = getTimer();
for (j=0; j<100000; j++) {
        n = xml.firstChild.childNodes;
        l = n.length;
        for (i=0; i<l; i++) {
                node = n[i];
        }
}
trace(getTimer()-t); // 1689

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


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

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