Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 24.11.2010, 22:10
КорДум вне форума Посмотреть профиль Отправить личное сообщение для КорДум Найти все сообщения от КорДум
  № 1  
Ответить с цитированием
КорДум
 
Аватар для КорДум

блогер
Регистрация: Jan 2008
Адрес: syktyvkar
Сообщений: 3,803
Записей в блоге: 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..*)
То есть, вроде бы все правильно. Загоняю даже в массив, он становится многомерным и заполняется. Вроде бы тоже правильно работает. Но никак не могу вывести трейсами визуализацию дерева (хотя бы просто пробелами отделить). Плюс у меня стойкое очучение, что это все сделано неверно или, по крайней мере, нелогично и нерационально.
Помогите, пожалуйста, справиться с задачей.
__________________
тут я

Старый 24.11.2010, 22:39
-De- вне форума Посмотреть профиль Отправить личное сообщение для -De- Найти все сообщения от -De-
  № 2  
Ответить с цитированием
-De-
 
Аватар для -De-

блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
Отправить сообщение для -De- с помощью ICQ Отправить сообщение для -De- с помощью Skype™
да вродь нормально, разве что сама структура из массивов, где первый эл-т - имя, неинтуитивна
Код 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 + "}");
		}
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают.

Старый 24.11.2010, 22:46
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 3  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
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
КорДум вне форума Посмотреть профиль Отправить личное сообщение для КорДум Найти все сообщения от КорДум
  № 4  
Ответить с цитированием
КорДум
 
Аватар для КорДум

блогер
Регистрация: Jan 2008
Адрес: syktyvkar
Сообщений: 3,803
Записей в блоге: 10
-De-, во блин, а все так просто оказалось и решение лежало на поверхности. Спасибо.

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

Старый 24.11.2010, 23:29
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 5  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Предлагаю как есть пользоваться XML. Необходимость преобразования в другой носитель для меня неочевидна.
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

Старый 25.11.2010, 00:34
КорДум вне форума Посмотреть профиль Отправить личное сообщение для КорДум Найти все сообщения от КорДум
  № 6  
Ответить с цитированием
КорДум
 
Аватар для КорДум

блогер
Регистрация: Jan 2008
Адрес: syktyvkar
Сообщений: 3,803
Записей в блоге: 10
dimarik, а никто xml и не трогает (:
Это нужно, например, для построения меню-дерева с раскрывающимися элементами-папками.
__________________
тут я

Создать новую тему Ответ Часовой пояс GMT +4, время: 02:49.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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