Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Рекурсивный обход xml и построение дерева (http://www.flasher.ru/forum/showthread.php?t=147050)

КорДум 24.11.2010 22:10

Рекурсивный обход xml и построение дерева
 
Всем привет. Помнится, давно-давно делал как-то обход каталогов винды на делфе, пользовался велосипедами, в принципе, но понимал, что делаю. Так вот, потребовалось сделать аналогичное на ас3. Наваял тестовую xml, сделал у каждого элемента атрибут name, считываю его, пробегаясь рекурсией.
Код AS3:

private var arrTree:Array = [];
...
private function parseXML(e:Event):void {
        xml = new XML(xmlLoader.data);
        changeTree(xml, arrTree);
}
 
private function changeTree(xml:XML, arr:Array):void {
        for each (var child:XML in xml.*) {
                var name:String = child.@name;
                var arrNew:Array = [];
                arrNew.push(name);
                arr.push(arrNew);
                //trace(arrNew);
                changeTree(child, arrNew);
        }
}

Считывается и работает аналогично вот такому:
Код AS3:

for each (var child:XML in xml..*)

То есть, вроде бы все правильно. Загоняю даже в массив, он становится многомерным и заполняется. Вроде бы тоже правильно работает. Но никак не могу вывести трейсами визуализацию дерева (хотя бы просто пробелами отделить). Плюс у меня стойкое очучение, что это все сделано неверно или, по крайней мере, нелогично и нерационально.
Помогите, пожалуйста, справиться с задачей.

-De- 24.11.2010 22:39

да вродь нормально, разве что сама структура из массивов, где первый эл-т - имя, неинтуитивна
Код AS3:

public function Main():void 
                {
                        var tst:Array = [];
                        changeTree2(
                        <a name="1">
                                <b name="2"/>
                                <c name="3">
                                        <d name="4" />
                                </c>
                        </a>
                        ,tst, "");
                }
 
                private function changeTree(xml:XML, arr:Array, indent:String):void {
                        arr.push(xml.@name);
                        trace(indent + xml.@name);
                        for each (var child:XML in xml.*) {
                                var name:String = child.@name;
                                var arrNew:Array = [];
                                arr.push(arrNew);
                                changeTree(child, arrNew, indent+"\t");
                        }
                }
                private function changeTree2(xml:XML, arr:Array, indent:String):void {
                //с рюшечками
                        arr.push(xml.@name);
                        if (xml.children().length()) {
                                trace(indent + xml.@name+" {");
                        }
                        else {
                                trace(indent + xml.@name);
                        }
                        for each (var child:XML in xml.*) {
                                var name:String = child.@name;
                                var arrNew:Array = [];
                                arr.push(arrNew);
                                changeTree2(child, arrNew, indent+"\t");
                        }
                        if (xml.children().length()) trace(indent + "}");
                }


expl 24.11.2010 22:46

1. Можно подключить as3corelib.swc и тупо вывести так:
Код AS3:

trace (JSON.encode(arr));

2. Можно поискать в сети сериализаторы в более удобочитаемый тестовый вид
3. Можно написать свой сериализатор:
Код AS3:

function objectToString(object:Object, space:String = ""):String
{
  if ((object is int) || (object is String) || (object is Number) || (object == null) || (object is Boolean))
  {
    return object + "\n";
  }
  var text:String = "\n";
  var spaceNew:String = space + "\t";// Увеличиваем отступ
  for (var key:String in object)
  {
    text += "|" + space + key + ": " + objectToString(object[p], spaceNew);
  }
  return text;
}
 
trace(objectToString(arr));


КорДум 24.11.2010 22:50

-De-, во блин, а все так просто оказалось и решение лежало на поверхности. Спасибо.

Добавлено через 2 минуты
expl, серилизатор - это метод форматирования отступами?

dimarik 24.11.2010 23:29

Предлагаю как есть пользоваться XML. Необходимость преобразования в другой носитель для меня неочевидна.

КорДум 25.11.2010 00:34

dimarik, а никто xml и не трогает (:
Это нужно, например, для построения меню-дерева с раскрывающимися элементами-папками.


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

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