Показать сообщение отдельно
Старый 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.