Показать сообщение отдельно
Старый 04.01.2008, 20:27
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 6  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Вот, пример накатал. Смысл в том, что грузится ХМЛ порциями. Этот класс так же умеет вещать загрузку следующей порции, ошибку и завершение загрузки. Так же можно узнать текщий номер загрузки, ну и вообще, переделывайте как вам надо =).

Сам класс:
Код:
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>
Немного еще добавил информации.
__________________
Hell is the possibility of sanity


Последний раз редактировалось wvxvw; 04.01.2008 в 22:03.