PDA

Просмотр полной версии : работа с XML


Dr_Bra
20.02.2010, 00:48
Всем здравствуйте!)
У меня сложный вопрос.
Вкрадце опишу ситуацию: есть XML, он содержит 3 чайлда и эти чайлды имеют около 10 параметров. Мы загружаем эту xml-ку, загружаем на сцену 3 ее чайлда в виде их первого параметра (тоесть -иконки). И при клике на одну из этих иконок, нам нужно обратиться к xml-у и загрузить новые параметры того чайлда на которого кликнули.

У меня получается получается обращаться к нужным параметрам, но не получается их загружать в клип. Помогите, плиз, разобраться


import actionScript.PopUpManager;
import flash.display.Sprite;

var xmlLoader:URLLoader=new URLLoader(new URLRequest("xml.xml"));
var xmlData:XML;
var xmlList:XMLList;

xmlLoader.addEventListener(Event.COMPLETE, getXML);
function getXML(e:Event):void
{
xmlData=XML(e.target.data);
xmlList=xmlData.children();

for (var i:int = 0; i < xmlList.length(); i++)
{
var personIcon:MovieClip = new MovieClip();//здесь я пытаюсь создать объекты для новых параметров, которые нужно загрузить
var imgSmall:MovieClip = new MovieClip();

var picLoader:Loader = new Loader();
picLoader.load(new URLRequest(xmlList[i].attributes()[0])); //ссылка на иконки
picLoader.x=20;
picLoader.y=65*i+20;
picLoader.name=xmlList[i].attributes()[1];//вот эту хитрость применили как-то но она работает только для щдного параметра (


imgSmall.name=xmlList[i].attributes()[2];//имя второго параметра (картинка)

trace(imgSmall.name);//ссылка выводится правильная, но как ее загрузить в следующей функции?

addChildAt(picLoader, 0); //--наши иконки

picLoader.addEventListener(MouseEvent.CLICK, showCard);
}
}


function showCard(e:MouseEvent):void
{
var container:Sprite = new Sprite();
addChildAt(container, 1);

var card_mc:PopUpManager = new card();
container.addChild(card_mc);
container.setChildIndex(card_mc, 0);
container.name="myContainer";

var picLoader:Loader = new Loader();//вот тут - то он и загружает только тот самый один парамтр
picLoader.load(new URLRequest(e.target.name));
card_mc.photoSmall_mc.addChild(picLoader);

container.x=stage.stageWidth/2-container.width/2;
container.y=stage.stageHeight/2-container.height/2-550;


}

Wolsh
20.02.2010, 01:53
Я признаться не понял, что скрывается в аттрибуте [1] (и почему бы не начать уже использовать человекочитаемые имена вместо индексов. Благо е4х с этим отлично ладит)... Вобщем Ваш экземпляр класса Loader хранит аттрибут [1], а некий клип imgSmall (который будет удален после выполнения обработчика getXML - Вы нигде не сохраняете ссылку на этот клип и никуда не добавляете сам клип) - аттрибут [2], который таким образом теряется безвозвратно. Для решения я бы посоветовал использовать утилиту Dictionary. Завести два справочника - для thumbs и для fullsize. В парсере xml для каждого Лоадера завести в справочниках свойства (ссылки), и при клике Вы всегда сможете запросить в Dictionary ссылку для (лоадера) из MouseEvent.target... Может показаться тяжеловесным, но хорошо очищает логику приложения.

Dr_Bra
20.02.2010, 12:11
Wolsh, а можно примерчик с такой логикой?

Добавлено через 3 часа 37 минут
Я признаться не понял, что скрывается в аттрибуте [1] (и почему бы не начать уже использовать человекочитаемые имена вместо индексов. Благо е4х с этим отлично ладит)... Вобщем Ваш экземпляр класса Loader хранит аттрибут [1], а некий клип imgSmall (который будет удален после выполнения обработчика getXML - Вы нигде не сохраняете ссылку на этот клип и никуда не добавляете сам клип) - аттрибут [2], который таким образом теряется безвозвратно. Для решения я бы посоветовал использовать утилиту Dictionary. Завести два справочника - для thumbs и для fullsize. В парсере xml для каждого Лоадера завести в справочниках свойства (ссылки), и при клике Вы всегда сможете запросить в Dictionary ссылку для (лоадера) из MouseEvent.target... Может показаться тяжеловесным, но хорошо очищает логику приложения.

а что означают эти названия (humbs и fullsize)? Я так понимаю, что нужно заводить столько справочников, сколько свойств (ссылок) имеет наш чайлд в xml-ке?

Добавлено через 4 часа 36 минут

import actionScript.PopUpManager;
import flash.display.Sprite;


var xmlLoader:URLLoader=new URLLoader(new URLRequest("xml.xml"));
var xmlData:XML;
var xmlList:XMLList;

var personIcon:Object;
var photoSmall:Object;
var photo1:Object;
var photo2:Object;
var photo3:Object;
var photo4:Object;
var personName:String;
var personLive:String;
var personInfo:String;
var personMail:String;
var personMobile:String;
var personSkype:String;
var personIcq:Number;

xmlLoader.addEventListener(Event.COMPLETE, getXML);
function getXML(e:Event):void
{
xmlData=XML(e.target.data);
xmlList=xmlData.children();

for (var i:int = 0; i < xmlList.length(); i++)
{
var picLoader:Loader = new Loader();
picLoader.load(new URLRequest(xmlList[i].attributes()[0]));
picLoader.x=20;
picLoader.y=65*i+20;

picLoader.name = xmlList[i].attributes()[1];
//personIcon.name = xmlList[i].attributes()[0];
//photoSmall.name = xmlList[i].attributes()[1];
//trace(personIcon.name);

addChildAt(picLoader, 0);//--наши иконки
picLoader.addEventListener(MouseEvent.CLICK, showCard);
}
}


function showCard(e:MouseEvent):void
{
var container:Sprite = new Sprite();
addChildAt(container, 1);

var card_mc:PopUpManager = new card();
container.addChild(card_mc);
container.setChildIndex(card_mc, 0);
container.name="myContainer";

var picLoader:Loader = new Loader();
picLoader.load(new URLRequest(e.target.name));
card_mc.photoSmall_mc.addChild(picLoader);

container.x=stage.stageWidth/2-container.width/2;
container.y=stage.stageHeight/2-container.height/2-550;

//trace(picLoader.name);
}


кото-нибудь может поправить код, что бы переменные

var personIcon:Object;
...
var personIcq:Number;

загружали в себя соответствующие параметры соответствующего чайлда?

если задавать имена таким образом

picLoader.name = xmlList[i].attributes()[1];
personIcon.name = xmlList[i].attributes()[0];

xmlList приобретает значение равное общему колличеству чайлдов, а не определенного чайлда, как это исправить ..

Wolsh
21.02.2010, 00:22
Пример использования Dictionary и е4х

Dr_Bra
21.02.2010, 14:07
Ух, большущее спасибо, пробую разобраться, там столько непонятных файлов )

Wolsh
21.02.2010, 14:36
Это проект для FlashDevelop. В папке src лежит класс документа. В папке bin - все файлы, свфка и папка с изображениями (в ней же xml-ка).

Добавлено через 23 минуты
Я собственно хотел просто показать - не мучайте себя старым стилем, чилдренами, аттрибутесами и прочими доступами аля массив. Если сами пишете xml-ку для проекта, и имена тегов/аттрибутов известны - используйте для доступа к ним имена.
Используйте Справочник (класс Dictionary), если не планируете ооп подход - с созданием специальных классов, у которых были бы предусмотрены необходимые свойства (поля) для хранения нужных данных (в вашем случае например карточка персоны должна была бы быть отдельным классом, принимающим как параметр XML-фрагмент из общей xml-ки и создающим все вложенные элементы и загружающим внешний контент - ведь все карточки однотипны, специальный класс просто напрашивается сам - а не собираться "на лету" в Мейне; но я оставил такой подход в примере, как и xml-ку с аттрибутами вместо тегов, что вобщем тоже нехорошо).