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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 09.01.2007, 15:56
Annihilator вне форума Посмотреть профиль Отправить личное сообщение для Annihilator Найти все сообщения от Annihilator
  № 11  
Ответить с цитированием
Annihilator
 
Аватар для Annihilator

Регистрация: Sep 2005
Адрес: Kiev
Сообщений: 73
Отправить сообщение для Annihilator с помощью ICQ
нет, ты немного не понял.
В примере выше объект "х" - это xml-объект, в котором доступ к значениям осуществляется через nodeValue.
Метод toObject возвращает стандартный флешовый объект с обычными свойствами/значениями, т.е. "x" и "xmlobj" - разные объекты по сути и по классам.

В случае нескольких тегов с одинаковым именем, метод создаёт свойство-массив. Например:
Код:
s = '<?xml version="1.0" ?>
<top>
<item name="one" id="23">first</item>
<item name="two" link="www.google.com">first</item>
<item param="Node 2 attribute">
	<some>777</some>
	<thing>qwerty</thing>
</item>
<item name="four">4 all</item>
</top>';
var x:XML=new XML();
x.ignoreWhite=true; // это обязательно задавать
x.parseXML(s);
var obj = x.toObject();
// дальше обращаться к свойствам созданого объекта obj
// например, чтобы прочесть значение узла <thing> :
trace(obj.top.item[2].thing); // выводит  qwerty

Старый 09.01.2007, 16:06
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 12  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Нет, я все-равно не понимаю, зачем все эти преобразования и перемешивания данных? Облегчить жизнь? Скорее усложнить, о чем и свидетельствует эта тема…

Старый 09.01.2007, 16:16
Annihilator вне форума Посмотреть профиль Отправить личное сообщение для Annihilator Найти все сообщения от Annihilator
  № 13  
Ответить с цитированием
Annihilator
 
Аватар для Annihilator

Регистрация: Sep 2005
Адрес: Kiev
Сообщений: 73
Отправить сообщение для Annihilator с помощью ICQ
Да, а как ты обратишься к значению узла <thing> вышепреведеного xml-a?

Старый 09.01.2007, 16:25
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 14  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Изменил бы архитектуру таким образом, чтобы одному логическому элементу не пришлось бы обращаться глубже своих детей. Не говоря уже о том, что была бы четкая структура XML, с определенными правилами построения.

Старый 09.01.2007, 17:43
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 15  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
Цитата:
Сообщение от Annihilator
Да, а как ты обратишься к значению узла <thing> вышепреведеного xml-a?
Основа:
Код:
function getNode (node, name) {
	for (var i = 0; i < node.childNodes.length; i++) {
		if (node.childNodes[i].nodeName.toLowerCase () == name.toLowerCase ()) {
			return node.childNodes[i];
		}
	}
};
__________________
(и)Нильс.ru | Плагины для FlashDevelop

Старый 09.01.2007, 20:40
Iv вне форума Посмотреть профиль Отправить личное сообщение для Iv Посетить домашнюю страницу Iv Найти все сообщения от Iv
  № 16  
Ответить с цитированием
Iv
 
Аватар для Iv

Регистрация: Apr 2001
Адрес: Moscow
Сообщений: 1,475
Ажно руки зачесались дописать книгу про XML.

Пара советов:
- etc дело говорит: преобразовывать стандартный объект (XML) в нестандартный дело сомнительное.

- чтобы достучаться до значения атрибута и получить его в нужном тебе типе, просто сделай методы конвертации/доступа. Поскольку расширить XMLNode своим классом нерентабельно, лучше юзать композицию. К примеру, желаем получить доступ к значению атрибута как к массиву:
(пример не рабочий, просто как принцип)
Код:
class XMLUtils {

 public static function getAttributeArray (node:XMLNode, name:String):Array {
 var arrtributes_obj:Object = node.attributes;
  if (typeof arrtributes_obj[name] == "string") {
   arrtributes_obj[name] = arrtributes_obj[name].split(",");
  }
  return arrtributes_obj[name];
 }

  ....... 

}
соответственно, ты этим методом спокойно получаешь атрибут узла как массив. То же самое делаешь для Number и др.

- разберись со своим стандартом XML, сделай правильную структуру. Работа с данными не должна быть в виде длинных иерархических обращений. Передавай узлы на обработку экземплярам, а не управляй ими централизованно. К примеру, у тебя на сцене несколько персонажей, привязанных к юзерам. Их состояние апдейтится из XML.
Тогда лучше сделать XML вида:
Код:
<state>
  <user id="iv">
    <action name="jumpLeft" arguments="10,12">
    <action name="totalWin" arguments="350">
  </user>
  <user id="etс">
    <action name="jumpDown" arguments="10,-30">
    <action name="totalLose" arguments="-200">
  </user>
</state>
далее, при получении данных, просто пробегаем по нодам первого уровня и раздаем их на обработку экземплярам:
Код:
private function onLoad (ok) {
....

  var node:XMLNode = this.firstChild.firstChild;
  while (node) {
    var id:String = XMLUtils.getAttributeString(node, "id");
    UserClass.updateInstance(id, node);
    node = node.nextSibling;
  }
}
Следующий этап - обработка полученных данных экземплярами:
Код:
class UserClass {

  private static var __users:Object;

  public static function updateInstance (id:String, node:XMLNode):Void {
    var user:UserClass = __users[id];
    user.updateState(node);
  }

  .....

  private function updateState(node:XMLNode):Void {
    node = node.firstChild;
    while (node) {
      var action_name:String = XMLUtils.getAttributeString(node, "name");
      var action:Function = this[action_name];
      var arguments_arr:Array = XMLUtils.getAttributeArray(node, "arguments");
      if (action) {
        action.apply(this, arguments_arr);
      }
      node = node.nextSibling
    }
  }

   private function jumpLeft (distance:Number, height:Number):Void {
      distance = Number(distance) || 0;
      height = Number(height) || 0;
      ......
   }

}
- собственно проверка и приведение типов также должны быть и непосредственно в методе-обработчике (мали ли откуда еще придется его вызывать).


Резюмируем:
- получили данные в приложение
- в приложении раскидали по экземплярам
- в экземплярах раскидали по обработчикам
- в обработчиках проверили типы, привели к нужным
- выполнили действия.

код выше - не рабочий, просто иллюстрация.
- оч тяжело писать код прямо здесь... три раза правил


Последний раз редактировалось Iv; 09.01.2007 в 20:47.
Старый 09.01.2007, 20:54
Iv вне форума Посмотреть профиль Отправить личное сообщение для Iv Посетить домашнюю страницу Iv Найти все сообщения от Iv
  № 17  
Ответить с цитированием
Iv
 
Аватар для Iv

Регистрация: Apr 2001
Адрес: Moscow
Сообщений: 1,475
Да, обрати внимание, что нигде в коде не обращаемся к узлам - детям детей.
Исключение в onLoad, да и то потому, что this - пустой.
Второе исключение я допускаю для текстовых узлов в обращениях вида:
node.firstChild.nodeValue;
все остальные случаи - признак неидеальной организации проекта

Старый 09.01.2007, 20:59
Fl00r вне форума Посмотреть профиль Отправить личное сообщение для Fl00r Найти все сообщения от Fl00r
  № 18  
Ответить с цитированием
Fl00r
 
Аватар для Fl00r

Регистрация: Jun 2005
Адрес: dreams
Сообщений: 1,137
Отправить сообщение для Fl00r с помощью ICQ
жаль тут в мемориз низзя.
__________________
Глупости какие-то говорите.

Старый 16.07.2007, 15:51
WindWalker вне форума Посмотреть профиль Отправить личное сообщение для WindWalker Найти все сообщения от WindWalker
  № 19  
Ответить с цитированием
WindWalker
[+1 18.03.08]

Регистрация: Nov 2006
Сообщений: 223
Цитата:
Сообщение от iNils
Основа:
Код:
function getNode (node, name) {
	for (var i = 0; i < node.childNodes.length; i++) {
		if (node.childNodes[i].nodeName.toLowerCase () == name.toLowerCase ()) {
			return node.childNodes[i];
		}
	}
};
Пробегать по циклу ради каждого нода?
А если несколько нодов с одинаковым именем?

Старый 16.07.2007, 15:53
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 20  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Цитата:
Сообщение от WindWalker
А если несколько нодов с одинаковым именем?
Этот вопрос задан мною в конце первой страницы. А в начале второй ответ на него.

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

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

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


 


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


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