![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
нет, ты немного не понял.
В примере выше объект "х" - это 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 |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Нет, я все-равно не понимаю, зачем все эти преобразования и перемешивания данных? Облегчить жизнь? Скорее усложнить, о чем и свидетельствует эта тема…
|
|
|||||
|
Да, а как ты обратишься к значению узла <thing> вышепреведеного xml-a?
|
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Изменил бы архитектуру таким образом, чтобы одному логическому элементу не пришлось бы обращаться глубже своих детей. Не говоря уже о том, что была бы четкая структура XML, с определенными правилами построения.
|
|
|||||
|
Регистрация: 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];
}
.......
}
- разберись со своим стандартом 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. |
|
|||||
|
Регистрация: Apr 2001
Адрес: Moscow
Сообщений: 1,475
|
Да, обрати внимание, что нигде в коде не обращаемся к узлам - детям детей.
Исключение в onLoad, да и то потому, что this - пустой. Второе исключение я допускаю для текстовых узлов в обращениях вида: node.firstChild.nodeValue; все остальные случаи - признак неидеальной организации проекта ![]() |
|
|||||
|
жаль тут в мемориз низзя.
__________________
Глупости какие-то говорите. |
|
|||||
|
[+1 18.03.08]
Регистрация: Nov 2006
Сообщений: 223
|
Цитата:
А если несколько нодов с одинаковым именем? |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Цитата:
|
![]() |
![]() |
Часовой пояс GMT +4, время: 23:13. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|