Форум 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)
-   -   Массивы (http://www.flasher.ru/forum/showthread.php?t=85849)

sart 02.10.2006 07:36

Массивы
 
Пишу рекурсивную функцию прохода по XML.
Данная радость должна возвращать инфу про исследуемый узел в виде массива, но, почему-то, делать этого не хочет, хотя все узлы пробегаются - я проверял.

Код:

class XmlParser {
        var xml:XML;
        public function XmlParser() {
                this.xml = new XML();
                this.xml.ignoreWhite = true;
        }
        public function loadFromString(_string:String) {
                this.xml.parseXML(_string);
        }
        function parseNode(_xmlNode) {
                if (!_xmlNode) {
                        return false;
                }
                var curArray:Array = new Array();
                var i:Number;
                curArray["nodeName"] = _xmlNode.nodeName;
                curArray["nodeType"] = _xmlNode.nodeType;
                if (_xmlNode.nodeType == 1) {
                        for (i=0; i<_xmlNode.childNodes.length; i++) {
                                curNode = null;
                                var curNode:XMLNode = _xmlNode.childNodes[i];
                                if (curNode) {
                                        curArray["childNodes"][i] = this.parseNode(curNode);
                                }
                        }
                }
                if ( _xmlNode.nodeType == 3 ) {
                        curArray["nodeValue"] = _xmlNode.nodeValue;
                }
                return curArray;
        }
       
        public function toArray() {
                return this.parseNode(this.xml.firstChild);
        }
}

пы.сы. да и вообще когда пытаюсь оттрейсить какой-нить массив - он молчит =(
пы.пы.сы. когда через дебаг пробую посмотреть List Variables, то массив он мне мой показывает, но никаких childNodes в нем нету =( - не пишется туды ничего..

etc 02.10.2006 13:56

А где объявление того, что curArray['childNodes'] — массив?

з.Ы. Про объявление public/private и типа возвращаемых данных умолчу.

sart 02.10.2006 19:36

__etc, пасип. объявил, что массив, уже стало легче, но, все-же не все пока бегает.

на тему остального, так правильнее? =)

Код:

class XmlParser {
        private var xml:XML;
        public function XmlParser() {
                this.xml = new XML();
                this.xml.ignoreWhite = true;
        }
        public function loadFromString(_string:String) {
                this.xml.parseXML(_string);
        }
        public function parseNode(_xmlNode):Array{
                if (!_xmlNode) {
                        return false;
                }
                var curArray:Array = new Array();
                var i:Number;
                curArray["nodeName"] = _xmlNode.nodeName;
                curArray["nodeType"] = _xmlNode.nodeType;
                if (_xmlNode.nodeType == 1) {
                        for (i=0; i<_xmlNode.childNodes.length; i++) {
                                curArray["childNodes"] = new Array();
                                curNode = null;
                                var curNode:XMLNode = _xmlNode.childNodes[i];
                                if (curNode) {
                                        curArray["childNodes"][i] = this.parseNode(curNode);
                                }
                        }
                }
                if ( _xmlNode.nodeType == 3 ) {
                        curArray["nodeValue"] = _xmlNode.nodeValue;
                }
                return curArray;
        }
       
        public function toArray() {
                return this.parseNode(this.xml.firstChild);
        }
}


miramax 02.10.2006 19:47

А зачем рекурсия?
Вот, писал когда-то чрезвычайно полезную функцию.
Код:

function nextNode(node_xml:XMLNode):XMLNode {
        if (node_xml.hasChildNodes() == true) return (node_xml.firstChild);
        else while (node_xml.nextSibling == null && node_xml.parentNode != null) node_xml = node_xml.parentNode;
        return (node_xml.nextSibling);
}

А обойти всё дерево можно так
Код:

xmlDoc = new XML("<A><C/></A><B/>")
xm = xmlDoc.firstChild

i = 0
while(xm!= null && xm != undefined)
{
    i+=1
    trace('нод № '+i)
    trace(xm)
    xm = nextNode(xm)
}

Позволяет просто перебрать все подряд ноды в дереве. Можно сделать перебор внутри одного нода, если поставить другие условия в while


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

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