Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flex (http://www.flasher.ru/forum/forumdisplay.php?f=84)
-   -   Обработка нескольких XML, загвоздка. (http://www.flasher.ru/forum/showthread.php?t=153203)

Termer 30.03.2011 11:41

Обработка нескольких XML, загвоздка.
 
Суть такова: есть страны, в каждой стране есть лиги(->команды->игроки и т.д). Списки лиг находятся в разных папках и файлах. Нужно вывести каждую страну и её лиги. Вот код:
Код AS3:

private static function clickBtn(e:MouseEvent):void
                {
                        urlLeague = new URLRequest();
 
                        for each (var Country:XML in xmlListCountrys.*)
                        {       
 
                                urlLeague.url = "Country/" + Country.SOURCE + "/" +
                                            Country.SOURCE + ".xml";//например : Country/en/en.xml - тут список лиг.
                                LoadLeague = new URLLoader();
                                LoadLeague.load(urlLeague);
                                            LoadLeague.addEventListener(Event.COMPLETE, completeLeague);
                                mx.core.FlexGlobals.topLevelApplication.labellllllllllllll.text =    mx.core.FlexGlobals.topLevelApplication.labellllllllllllll.text + " " + Country.NAME;
 
                        }
 
 
                }
 
                private static function completeLeague(e:Event):void
                {
 
                        xmlListLeagues = new XML(LoadLeague.data);
 
                        indexLeague = 0;
                        for each (var League:XML in xmlListLeagues.*)
                        {
                        mx.core.FlexGlobals.topLevelApplication.labellllllllllllll.text =          mx.core.FlexGlobals.topLevelApplication.labellllllllllllll.text + " " +
                                            xmlSearchLeague.*[indexLeague].NAME;                               
                                indexLeague++;
 
                        }
 
                }

После этого в mx.core.FlexGlobals.topLevelApplication.labellllllllllllll.text он должен вывести следующее:
россия
премьер-лига
молодёжные команды
первый дивизион
второй дивизион
англия
премьер-лига
конференция
шотландия
премьер-лига
д1
д2
д3

Но после обработки выдаёт лишь:
россия
англия
шотландия
премьер-лига
д1
д2
д3
Т.е метод completeLeague вызывается 1 раз и почему то самым последним. Жду идей и подсказок...

spacecadet 30.03.2011 16:26

Рискну предположить, что вызываемый метод:
Код AS3:

LoadLeague.load(urlLeague);

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

Termer 06.04.2011 10:57

Проблема в том, что completeLeague больше одного раза не вызывается.Если вызвать в цикле со счётчиком то на втором заходе ошибка вылетает.
TypeError: Error #1010: A term is undefined and has no properties.
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at flash.net::URLLoader/onComplete()
В итоге цикл проходит все страны и только потом вызывается completeLeague. Что делать не могу додуматься...подкиньте пару идей кто что думает...

OFFmind 06.04.2011 15:40

попробуйте убрать static в функции completeLeague()

Termer 06.04.2011 16:48

без static:
1120: Обращение несуществующего свойства completeSearchLeague.

OFFmind 07.04.2011 11:04

completeSearchLeague? - а где он в коде? В этом коде нет обращения к этому свойству...

Termer 07.04.2011 11:37

completeLeague*...так правильно.

OFFmind 08.04.2011 11:48

Странно... вообще в Вашем случае static не может так сильно мешать вызвать функцию(точнее отсутствие статика). Ведь вызов идет этого же класса.
Уберите статик и в функции нажатии кнопки(может ругается, из-за того что из статического метода вызывается обычный)... - даже если это не решит проблему, статические методы используются довольно редко, только если действительно необходимо. Ваши функции лучше делать обычными.
Если Вы вызываете этого класс из-вне, то не забывайте создать экземпляр класса(т.к. статики вызываются без него, а вот обычные - только после создания экземпляра)
т.е.
Код AS3:

var myCalss: MyClass = new MyClass();

Если все же это не решит проблему. Тогда советую для проверки поставить trace(или alert.show()) в функцию completeLeague() и посмотреть сколько раз она действительно вызывается. Если только один - будем думать почему. Если же несколько раз(но в labelllllllll выводится только один), то проблема в самой функции. Тогда лучше использовать несколько переменных типа String и потом склеивать в один ответ. Т.к. вызывать один и тот же лейбл в разных функциях черевато ошибками.

Termer 08.04.2011 13:17

Функция вызывается столько раз сколько укажешь вот только загружается именно последний элемент из цикла...в общем вот:
Код AS3:

private static function clickBtnSearch(e:MouseEvent):void
                {
                                  indexCountry = 5; //проверим первые 5 стран
 
                        for ( var i:int = 0; i < indexCountry; i ++)
                        {
                                xmlListPro = loadListLeagues(i);
                                mx.core.FlexGlobals.topLevelApplication.textTest.text = mx.core.FlexGlobals.topLevelApplication.textTest.text + xmlListPro;
                        }
 
private static function loadListLeagues(IndexCountrys:int):XML
                {
                        urlSearchLeague = new URLRequest();               
                        urlSearchLeague.url = "Country/" + xmlListCountrys.*[IndexCountrys].SOURCE + "/" + xmlListCountrys.*[IndexCountrys].SOURCE + ".xml";
                        LoadSearchLeague = new URLLoader();
                        LoadSearchLeague.load(urlSearchLeague);       
                        LoadSearchLeague.addEventListener(Event.COMPLETE, completeSearchLeague);
 
                        return xmlSearchLeague;
                }
 
                private static function completeSearchLeague(e:Event):void
                {
                        xmlSearchLeague = new XML(LoadSearchLeague.data);
                }

А вот что получаем в mx.core.FlexGlobals.topLevelApplication.textTest.text:
<SPAIN>
<LEAGUE>
<NAME>Примера</NAME>
<SOURCE>pr</SOURCE>
</LEAGUE>
<LEAGUE>
<NAME>Сегунда</NAME>
<SOURCE>seg</SOURCE>
</LEAGUE>
</SPAIN><SPAIN>
<LEAGUE>
<NAME>Примера</NAME>
<SOURCE>pr</SOURCE>
</LEAGUE>
<LEAGUE>
<NAME>Сегунда</NAME>
<SOURCE>seg</SOURCE>
</LEAGUE>
</SPAIN><SPAIN>
<LEAGUE>
<NAME>Примера</NAME>
<SOURCE>pr</SOURCE>
</LEAGUE>
<LEAGUE>
<NAME>Сегунда</NAME>
<SOURCE>seg</SOURCE>
</LEAGUE>
</SPAIN><SPAIN>
<LEAGUE>
<NAME>Примера</NAME>
<SOURCE>pr</SOURCE>
</LEAGUE>
<LEAGUE>
<NAME>Сегунда</NAME>
<SOURCE>seg</SOURCE>
</LEAGUE>
</SPAIN><SPAIN>
<LEAGUE>
<NAME>Примера</NAME>
<SOURCE>pr</SOURCE>
</LEAGUE>
<LEAGUE>
<NAME>Сегунда</NAME>
<SOURCE>seg</SOURCE>
</LEAGUE>
</SPAIN>
Если indexCountry изменить на 1 или, 2 или 3,4..10 то будет выдавать 1 раз первую страну и её лиги, или 2 раза вторую..10 раз десятую страну и её лиги и т.д...

Добавлено через 15 минут
пробовал записывать результат в массив, результат тот же: в каждый элемент записывается
<SPAIN>
<LEAGUE>
<NAME>Примера</NAME>
<SOURCE>pr</SOURCE>
</LEAGUE>
<LEAGUE>
<NAME>Сегунда</NAME>
<SOURCE>seg</SOURCE>
</LEAGUE>
</SPAIN>...


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

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