Ажно руки зачесались дописать книгу про 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;
......
}
}
- собственно проверка и приведение типов также должны быть и непосредственно в методе-обработчике (мали ли откуда еще придется его вызывать).
Резюмируем:
- получили данные в приложение
- в приложении раскидали по экземплярам
- в экземплярах раскидали по обработчикам
- в обработчиках проверили типы, привели к нужным
- выполнили действия.
код выше - не рабочий, просто иллюстрация.
- оч тяжело писать код прямо здесь... три раза правил
