|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Рекурсивный обход xml и построение дерева
Всем привет. Помнится, давно-давно делал как-то обход каталогов винды на делфе, пользовался велосипедами, в принципе, но понимал, что делаю. Так вот, потребовалось сделать аналогичное на ас3. Наваял тестовую xml, сделал у каждого элемента атрибут name, считываю его, пробегаясь рекурсией.
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); } } То есть, вроде бы все правильно. Загоняю даже в массив, он становится многомерным и заполняется. Вроде бы тоже правильно работает. Но никак не могу вывести трейсами визуализацию дерева (хотя бы просто пробелами отделить). Плюс у меня стойкое очучение, что это все сделано неверно или, по крайней мере, нелогично и нерационально. Помогите, пожалуйста, справиться с задачей.
__________________
тут я |
|
|||||
блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
|
да вродь нормально, разве что сама структура из массивов, где первый эл-т - имя, неинтуитивна
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 + "}"); }
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают. |
|
|||||
1. Можно подключить as3corelib.swc и тупо вывести так:
2. Можно поискать в сети сериализаторы в более удобочитаемый тестовый вид 3. Можно написать свой сериализатор: 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)); |
Часовой пояс GMT +4, время: 18:11. |
|
« Предыдущая тема | Следующая тема » |
|
|