PDA

Просмотр полной версии : Очень большая xml-ка


JaLav
18.12.2007, 16:56
Здравствуйте
Есть карта
Данные - в хмл. Данных много. xml-ка весит 3 Mb

Есть вариант разбить ее на части - для каждой страны сделать отдельную.

Можно не грузить всю инфу сразу, а после клика на страну. Все остальные страны делать недоступны пока данные не загрузятся. После загрузки показывается инфа о данной странеъ

Но заказчик хочет: чтоб инфа грузилась и паралельно можно было работать с флешкой. Т.е. по которым странам инфа загрузилась, на те можно уже кликать и инфа сразу отображается, а по остальным еще грузится

Это возможно? Флешка тормозить не будет?

wvxvw
18.12.2007, 17:17
Да, это возможно (если разбить на страны).
Тормозить - не понятна формулировка. Ну, запустите ее на 468-ке, если нужно, чтобы тормозила %)))
А еще лучше повыбрасывать все лишнее из ХМЛ. В 3 Мб можно таааааакое кол-во инфы запихать...

JaLav
18.12.2007, 17:41
спасибо)

JaLav
03.01.2008, 21:28
И все же. Для всех стран пишу обработчики (например onRollOver меняется цвет страны).
Потом в новом цикле гружу инфу по странам (города, инфа по городам).
Так вот пока эта вся инфа грузится (с хмл), обработчики событий не работают.
А надо чтоб работали, ну хотя бы те, по которым данные уже загрузились.
Что для этого надо сделать?

Напоминаю, что

заказчик хочет: чтоб инфа грузилась и паралельно можно было работать с флешкой. Т.е. по которым странам инфа загрузилась, на те можно уже кликать и инфа сразу отображается, а по остальным еще грузится

iNils
03.01.2008, 21:34
Так вот пока эта вся инфа грузится (с хмл), обработчики событий не работают.
А надо чтоб работали, ну хотя бы те, по которым данные уже загрузились.
Что для этого надо сделать?А что вы сделали?

MrPoma
03.01.2008, 22:35
заказчик хочет: чтоб инфа грузилась и паралельно можно было работать с флешкой. Т.е. по которым странам инфа загрузилась, на те можно уже кликать и инфа сразу отображается, а по остальным еще грузится
лично я бы с такого сайта(или чего там у вас) сваили бы нераздумывая, ибо в нете я через пчелиный клик+. попробуйте убедить заказчика, что грамотнее дать посетителю выбор, что грузить, а что нет

wvxvw
03.01.2008, 22:43
Ну хоть какой-то упрощенный пример бы...
Ей богу, не могу понять что нужно было запихать в ХМЛ чтобы добиться таких размеров. Стран в мире всего около 130, ну, пускай на каждую страну нужно по 10 переменных по 8 байт каждая, ну и еще на оформление самого ХМЛя прибавим по 8 байт на страну и того 130*90 = 12К... откуда 3КК?

MrPoma
03.01.2008, 22:47
там же в хмл есть инфа по городам. а это текст. сколько городов на планете?

wvxvw
03.01.2008, 22:59
НУ, не знаю, самым приемлимым мне кажется вариант - чтобы флешка при клике на страну обращалась к серверному скрипту, передавала ИД кликнутой страны, и по приходе ответа показывала нужную информацию. По-другому, даже с очень быстрым и-нетом, если мне эта информация не жизненно необходима 3КК я бы не стал ждать...

MrPoma
03.01.2008, 23:28
НУ, не знаю, самым приемлимым мне кажется вариант - чтобы флешка при клике на страну обращалась к серверному скрипту, передавала ИД кликнутой страны, и по приходе ответа показывала нужную информацию. По-другому, даже с очень быстрым и-нетом, если мне эта информация не жизненно необходима 3КК я бы не стал ждать...
согласен

enepx
03.01.2008, 23:47
а как вообще можно обработать незагруженный xml? он до полной загрузки будет как минимум невалиден, т.к. не будет закрывающего (рутового) тега.

MrPoma
03.01.2008, 23:51
поэтому его надо разделить на несколько маленьких

JaLav
04.01.2008, 00:05
Вот пример
В хмл данные по городам двух стран (для представления, что нужно запихнуть в хмл, чтоб он весил столько)

а как вообще можно обработать незагруженный xml?

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


Я вот думаю...
Если грузим рисунок в некий клип на сцене, а сбоку кнопки, то пока рисунок грузится, кнопки доступны, все нормально
Может хмл грузить в клип отдельный, как-то хитро...

или все-таки нельзя чтоб и данные с хмл грузились и наводить на элементы флешки можно было?

ау, я тут пример прикрепила
кому интересно можете взглянуть

MrPoma
04.01.2008, 01:22
дык элементы флэшки, на которые вы собираетель наводить строятся по данным из хмл. или нет?

JaLav
04.01.2008, 03:10
нет!!!
В том то и дело!!!!
См. пример
Там просто кнопка на _root, с хмл-данными никак не связана, но пока хмл не загрузится, навести на нее нельзя. Т.е. навести можно, но не работает

Почему так происходит?
Ведь когда грузить не хмл-данные, а, например, рисунок - такого нет.

iNils
04.01.2008, 03:20
А у меня работает. До загрузки, во время загрузки и после загрузки.

JaLav
04.01.2008, 12:47
Хм, вот выложила сюда
http://jalav.h17.ru/
У Вас какой флеш-плеер?
У меня 9-й
Поробовала настройки Publish Settings
Assess Network only
Access local files only
не помогает

в чем еще может быть загвоздка?

iNils
04.01.2008, 13:57
9-ка
Ссылку посмотрел, но у меня xml загружается быстрее, чем я успеваю что-либо сделать.

JaLav
04.01.2008, 14:59
Странно :)
Выходит, что у Вас с сервера хмл загружается быстрее, чем локально
Локально Вы ж тестировали пример

А у меня работает. До загрузки, во время загрузки и после загрузки.

на сервере тот же пример и те же хмл-ки

Я закинула на сервер 10 хмл-ок, и во флеш подгружаю не 2, а все 10
Но самая большая все-таки первая
Так вот когда грузятся те маленькие, немного подтормаживает, но почти не заметно,
а первая у меня грузится секунды 3-4 и в это время кнопка недоступна
Я там еще текст поставила "Первая xml-ка грузится", чтоб было видно, когда она грузится http://jalav.h17.ru/

p.s. При наведении кнопка должна менять цвет с красного на серый

iNils
04.01.2008, 15:03
Локально я пользуюсь симулятором загрузки, который может замедлить скорость отдачи для тестирования медленных соединений.

JaLav
04.01.2008, 15:25
ок, спасибо Вам, что попытались мне помочь

тут я вижу люди скачивают исходник, но без xml
xml тоже надо скачать и закинуть в ту же папку, что и swf (
swf грузит xml)

wvxvw
04.01.2008, 18:19
Результаты такие же, как и у iNils'a кнопка реагирует, единственное, в исходнике у кнопки instanceName не указан, а так все нормально.

JaLav
04.01.2008, 19:08
Ну ладно, спасибо
Наверное это от компа зависит, сколько грузится хмл и тормозит ли при этом флеш
Просто хотелось узнать, стоит ли делать так, чтоб грузились все данные как бы в фоне и при этом можна было работать с флешкой.

Понимаю, что это немного нелогично, товарищ MrPoma правильно сказал

грамотнее дать посетителю выбор, что грузить, а что нет


но все же хотелось узнать теоретически, можно ли так делать

Вывод: так делать не желательно, потому что есть такие компы, как у меня (Атлон 1800), на которых в подобной ситуации флеш тормозит.:-)

MrPoma
04.01.2008, 19:18
еще все зависит от скорости соединения

JaLav
04.01.2008, 20:10
да, но у меня и локально так же

wvxvw
04.01.2008, 20:27
Вот, пример накатал. Смысл в том, что грузится ХМЛ порциями. Этот класс так же умеет вещать загрузку следующей порции, ошибку и завершение загрузки. Так же можно узнать текщий номер загрузки, ну и вообще, переделывайте как вам надо =).

Сам класс:
import mx.utils.Delegate;
//
class CXMLLoader {
private var nextChapter:Number = 0;
private var __xml:XML;
private var xml2load:XML;
private var __url:String = "";
private var __type:String = "";
private var __totalNodes:Number = 0;
//
public var addListener:Function;
public var broadcastMessage:Function;
function CXMLLoader(){
_global.AsBroadcaster.initialize(this);
__xml = new XML('<rootNode />');
}
private function loadNext():Void {
xml2load = new XML();
xml2load.ignoreWhite = true;
xml2load.onLoad = Delegate.create(this,handleOnLoad);
switch(__type){
case "XML":
xml2load.load(__url+nextChapter+'.xml');
break;
case "PHP":
xml2load.load(__url+'.php?xml='+nextChapter);
break;
}
}
public function startLoading(url:String,type:String,totalNodes:Number):Void {
__url=url;
__type=type;
__totalNodes=totalNodes;
loadNext();
}
private function handleOnLoad(b:Boolean):Boolean {
if(b){
for(var i:Number=0; i<xml2load.childNodes.length; i++){
__xml.childNodes[0].appendChild(xml2load.childNodes[0]);
}
broadcastMessage('loadingNodeDone', xml2load);
if(__totalNodes>__xml.childNodes[0].childNodes.length){
nextChapter++;
loadNext();
} else {
broadcastMessage('loadingDone', __xml);
}
} else {
broadcastMessage('loadingError', __xml, nextChapter);
}
return b;
}
public function set cRequest(n:Number):Void {
return;
}
public function get cRequest():Number {
return nextChapter;
}
public function set nodesLoaded(n:Number):Void {
return;
}
public function get nodesLoaded():Number {
return __xml.childNodes[0].childNodes.length;
}
}
Пример использования:
var cxmll:CXMLLoader = new CXMLLoader();
var m_xml:XML;
cxmll.addListener(this);
function loadingNodeDone(_xml:XML){
trace('loadingNodeDone >> listener: '+_xml);
trace('=============== finished loading node # '+cxmll.cRequest+' ===============');
trace('=============== loaded so far '+cxmll.nodesLoaded+' nodes ===============');
};
function loadingDone(_xml:XML){
m_xml = _xml;
trace('loadingDone >> listener: '+_xml);
};
cxmll.addListener(this);
cxmll.startLoading('test','XML',23);
Примерный ХМЛ (в моем случае их было 7 штук):
<!-- test0.xml -->
<city id='28' longitude='-117.89' latitude='33.74' photos='0' users='0' hostels='0' locationurl='hostels-a-city-n-28.html'>Santa Ana, CA</city>
<city id='33' longitude='-122.85' latitude='39.12' photos='0' users='0' hostels='0' locationurl='hostels-a-city-n-33.html'>Nice, CA</city>
<city id='40' longitude='-121.33' latitude='36.42' photos='0' users='1' hostels='0' locationurl='hostels-a-city-n-40.html'>Soledad, CA</city>
<city id='46' longitude='-117.914' latitude='33.8353' photos='0' users='0' hostels='2' locationurl='hostels-a-city-n-46.html'>Anaheim, CA</city>
<city id='57' longitude='-109.03' latitude='48.58' photos='0' users='0' hostels='0' locationurl='hostels-a-city-n-57.html'>Zurich, MT</city>

Немного еще добавил информации.

JaLav
04.01.2008, 21:33
Спасибо Вам огромное, что столько накатали:)!
Пойду разбираться