Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как вытащить XML из другого файла...? (http://www.flasher.ru/forum/showthread.php?t=131178)

p0okm 14.10.2009 15:11

Как вытащить XML из другого файла...?
 
Вложений: 1
Пробую научиться получать адреса файлов для загрузки в галерею из XML файла.
Написал тестовую программку, а она не работает.
Когда смотрю через trace то вижу, что класс Zagruzki_XML отрабатывает правильно,
а когда я его вызываю в корневом файле test_zgr_XML.fla то ничего не получается
хотя на переменную из класса Zagruzki_XML он не ругается и судя по всему он её видит.
Помогите разобраться.

Корневой файл :
Код AS3:

package
{
        import flash.display.*;
        import flash.net.*;
        import flash.events.*;
 
        public class Test_zgr_XML extends Sprite
        {               
                var adres_fayla:String = new String;
 
                var kilkist:Zagruzki_XML;
 
                public function Test_zgr_XML()
                {                       
                    kilkist = new Zagruzki_XML(this);
                        trace("adres_fayla =", adres_fayla);    // проверяю чистая ли переменная (P.S. естественно чистая)
                        adres_fayla = kilkist.adresa[0];        // загружаю в перемннную строку из XML документа прочитанного классом Zagruzki_XML
                        trace("adres_fayla =", adres_fayla);    // проверяю что теперь в переменной (P.S. увы null, хотя я надеялся увидить "img_test/1.swf" )
                }
        }       
}

класс Zagruzki_XML из одноимённого файла
Код AS3:

package
{
        import flash.display.*;
        import flash.events.*;
        import flash.net.*;
 
                public class Zagruzki_XML extends Sprite
                {                                                                       
                          var xml_Doc:XML;
                          var dokument_XML:URLLoader;                                                                       
                          var adresa:Array = new Array();
                          var itogo:int = new int;
                          var fayl_naznachenia:Test_zgr_XML;
 
                        public function Zagruzki_XML(fayl_naznachenia:Test_zgr_XML)
                        {
                                this.fayl_naznachenia = fayl_naznachenia;                                       
                                var zagruzka_iz_fayla:URLRequest = new URLRequest("test_fayl.xml"); 
                                dokument_XML = new URLLoader();                                 
                                dokument_XML.addEventListener(Event.COMPLETE, full_Zavantagenia);
                                dokument_XML.load(zagruzka_iz_fayla);
                        }
                            private function full_Zavantagenia(event:Event)
                          {
                                            xml_Doc = new XML(dokument_XML.data);
                                            for each (var schitat:XML in xml_Doc.*)            // считаю количество записей в XML документе
                                        {
                                                adresa[itogo] = xml_Doc.img[itogo];       
                                                trace( "adressa[itogo] =", adresa[itogo]);  // показываю каждую запись
                                                itogo++;                               
                                        }                                                       
                                                trace( "itogo =", itogo);                                  // показываю сколько записей в XML документе
                                        }
                        }
}

сам XML файл
Код:

<nabor>
          <img>"img_test/1.swf"</img>
          <img>"img_test/2.swf"</img>
          <img>"img_test/3.swf"</img>
          <img>"img_test/4.swf"</img>
</nabor>

исходники

p0okm 16.10.2009 17:37

Подскажите хоть в каком направлении искать!:umnik2:

Gaen 16.10.2009 17:47

Читать про асинхронные события.
Вкратце - вы запускаете загрузку xml и рассчитываете тут же получить результат. А в нашей суровой реальности файл будет загружен гораздо позже, чем отработает блок кода, который вызывает load.
C данными можно будет работать после того, как наступит Event.COMPLETE

Xpb7 16.10.2009 17:53

Необходимо время, чтобы ваш XML загрузился, необходимо вешать листенер. Это можно было понять, даже посмотрев на output. Трэйсы класса Test_zgr_XML выведуться раньше, чем трэйсы Zagruzki_XML класса.

Зачем вы так извращаетесь с именами перменных и классов? Они же вам ничего плохого не сделали!

p0okm 22.10.2009 16:06

Спасибо за подсказку, правда прогуглив всё что мог нашёл пару малоинформативных слов про "асинхронные операции" в Адобовском хелпе и практически всё.
Пробовал после
Код AS3:

kilkist = new Zagruzki_XML(this);

ставить цикл while ожидая выхода по завершению фактической загрузки, но тогда просто программка зависала.

Кстати
Код AS3:

dokument_XML.addEventListener(Event.COMPLETE, full_Zavantagenia);

присутствует в коде, или может его нужно слушать в вызывающем классе?
:(

Gaen 22.10.2009 16:55

Про ожидание циклом забудьте.

Код AS3:

dokument_XML.addEventListener(Event.COMPLETE, full_Zavantagenia);

Всё верно, данные становятся доступными, когда вызывается full_Zavantagenia. Соответственно из этой функции уже следует выполнять дальнейшие действия.

На самом деле нет никакого смысла писать отдельный класс для загрузки XML, для этого и был написан флэшовый URLLoader. Переносите код из Zagruzki_XML в главный класс, и будет вам счастье.

p0okm 24.10.2009 04:48

Продолжая попытки справится с этой загрузкой XML пришёл к такому вот варианту,
Тупо вставил таймер и после задержки получил ожидаемый результат:
Код AS3:

package
{
        import flash.display.*;
        import flash.net.*;
        import flash.events.*;
        import flash.utils.Timer;
 
        public class Test_zgr_XML extends Sprite
        {               
                var adres_fayla:String = new String;               
                var kilkist:Zagruzki_XML;               
                public function Test_zgr_XML()
                {                       
                    kilkist = new Zagruzki_XML(this);
                    var zadergka:Timer = new Timer(500, 1);
                    zadergka.addEventListener(TimerEvent.TIMER, timer_1);
                    zadergka.start();
                }
                private function timer_1 (event:TimerEvent):void
                {
                        adres_fayla = kilkist.adresa[kilkist.itogo - 1];
                        trace("adres_fayla =", adres_fayla);
                }
        }       
}

Естественно тут же захотелось увидеть как он реально загрузит картинки из указанных адресов. В функцию timer_1 дописал лоадер, а в самом конце ещё один тестовый трейсер:
Код AS3:

                private function timer_1 (event:TimerEvent):void 
                {
                        adres_fayla = kilkist.adresa[kilkist.itogo - 1];
                        trace("adres_fayla =", adres_fayla);
                        var image:Loader = new Loader();                   
                        image.load( new URLRequest(adres_fayla));
                        addChild(image);
                        trace("adres_fayla2 =", adres_fayla);
                }

В ответ получил :(, то есть финальный трейсер сработал раньше загрузки файла.
Код:

itogo = 3
adres_fayla = "img_test/tretiy.swf"
adres_fayla2 = "img_test/tretiy.swf"
Error #2044: Необработанный IOErrorEvent:. text=Error #2035: URL-адрес не обнаружен.

Тихо зверею, снова тупо вставляю тормоз в виде таймера
Код AS3:

package
{
        import flash.display.*;
        import flash.net.*;
        import flash.events.*;
        import flash.utils.Timer;
 
        public class Test_zgr_XML extends Sprite
        {               
                var adres_fayla:String = new String;
                var image:Loader = new Loader();
                var kilkist:Zagruzki_XML;
 
                public function Test_zgr_XML()
                {                       
                    kilkist = new Zagruzki_XML(this);
                    var zadergka:Timer = new Timer(500, 1);
                    zadergka.addEventListener(TimerEvent.TIMER, timer_1);
                    zadergka.start();
                }
                private function timer_1 (event:TimerEvent):void
                {
                    adres_fayla = kilkist.adresa[kilkist.itogo - 1];
                    trace("adres_fayla =", adres_fayla);                                           
                    image.load( new URLRequest(adres_fayla));
                    var zadergka2:Timer = new Timer(500, 1);
                    zadergka2.addEventListener(TimerEvent.TIMER, timer_2);
                    zadergka2.start();
                }
                private function timer_2 (event:TimerEvent):void
                {
                    addChild(image);
                    trace("adres_fayla2 =", adres_fayla);
                }
        }       
}

Получаю
Код:

itogo = 3
adres_fayla = "img_test/tretiy.swf"
Error #2044: Необработанный IOErrorEvent:. text=Error #2035: URL-адрес не обнаружен.
adres_fayla2 = "img_test/tretiy.swf"

Заменяю переменную с адресом из XML-файла adres_fayla = kilkist.adresa[kilkist.itogo - 1];
на adres_fayla = "img_test/tretiy.swf";
Всё работает даже без применения задержки.
Нитчего не понимаю :eek:
Почему так получается?:wacko:

Добавлено через 12 часов 57 минут
С проблемой пути разобрался, в XML нужно было путь писать не в кавычках.
А вот как обойтись без искуственной задержки в виде TimerEvent.TIMER
пока не знаю.


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

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