PDA

Просмотр полной версии : Загрузить информацию из 3 XML в один контент


KiL33
23.01.2009, 20:34
Есть 3 xml необходимо по очереди загрузить с трёх xml инфу.
Когда делаю циклом, информация загружается только с последнего xml.
for (var n:Number = 0; n < 3; n++)
{
urlList = "myXML" + n + ".xml";
xml.load(urlList);
}
Видимо нужно делать проверку, если загружена первая xml, брать из нее инфу, потом грузить следующую и т.д.
Только вот пока что это не выходит.

Цветкофф
23.01.2009, 21:19
KiL33,а_сутьба_объединить_в_одиН?

Fatality
23.01.2009, 21:36
я бы сделал так:
XML.prototype.ignoreWhite = true;
var XML_toLoad:XML = new XML();
var XML_Array:Array = ["images.xml", "text.xml", "info.xml"];
var loaded_XML:Array = [];
var counter:Number = 0;
XML_toLoad.onLoad = function()
{
loaded_XML.push(new XML(this));
if (counter < XML_Array.length - 1)
{
counter++;
this.load(XML_Array[counter]);
}
else trace(loaded_XML);
};
XML_toLoad.load(XML_Array[counter]);
по срабатыванию условия else массив loaded_XML содержит загруженные XML из списка XML_Array

Kuruki
23.01.2009, 21:37
Ну либо загружать по очереди (вызывать загрузку следующего после загрузки текущего), либо 3 объекта хмл создавать

KiL33
24.01.2009, 09:43
Fatality, Спасибо за пример он хорош, но есть пара недостатков. Возможно они возникли потому что вопрос мой был не полностью раскрыт.
XMl-ок может быть свободное количество, ну к примеру за максимум возьмём три. И само собой создавать массив с перечислением имен файлов не есть в моем случае хорошо. Разумеется проще цикл. Сами представьте если xml-ок будет больше двух десятков.
Информация в xml представляет собой атрибуты, с помощью которых строится структура
Очередной раз соглашусь с kuruki в данном случае с поочередной загрузкой.

import mx.utils.Delegate;

var urlList:Array;
var textLoader:XML;

// Составляем список имён файлов.
urlList = new Array();

for (var n:Number = 0; n < 3; n++)
{
urlList[n] = "myXML" + n + ".xml";

}

textLoader = new XML();
textLoader.onData = Delegate.create(this, onText);

// Обработчик события XML.onData
function onText(value:String):Void
{
//txt1.text += value;

// Загружаем xml-ки
xml.load(urlList[0]);
xml.ignoreWhite = true;
trace("ЗАГРУЖЕНО __"+urlList[0])

// Если файлы не кончились, грузим следующий.
if (urlList.length > 0)
{
var fileName:String;

fileName = urlList[0];
urlList.shift();

textLoader.load(fileName);
}
}
onText();
XML-ки считываются, но структура не создается.
Атрибуты считываются только с первого, хотя трейс показывает, что все xml по очереди были загружены
В примере полноценный код. Есть пара откровенных косяков, может кто-нибудь поможет исправить.

Wolsh
24.01.2009, 14:23
var xml:XML = new XML();
xml.onLoad = xmlLoaded;
var xmlDocs:Array = new Array();
var xmlCounter:Number = 0;
function xmlLoaded(ok:Boolean) {
if (ok) {
trace("загружена XML : "+xmlCounter);
xmlDocs.push(this.firstChild);
xmlCounter += 1;
loadXML(xmlCounter);
} else {
trace('...а больше нету...');
done();
}
}
function loadXML(count:Number) {
xml.load("myXML"+count+".xml");
}
//// cтартуем загрузку
loadXML(0);

//// все xml'ки загружены
function done() {

var startY:Number = 0;
for (var doc:Number = 0; doc<xmlDocs.length; doc++) {
var node:XMLNode = xmlDocs[doc].firstChild;
var i:Number = 0;
while (node) {

if (node.nodeName == 'node') {trace(node)
var message = this.attachMovie('mc', 'mc'+doc+'_'+i, this.getNextHighestDepth());
message.txt.autoSize = true;
message.txt_var = node.attributes['label'];
message._y = startY;
startY+=30;
i++;
}
node = node.nextSibling;
}
}
}

KiL33
24.01.2009, 18:14
Спасибо, это реализовано значительно лучше, чем даже как я хотел сделать:)
Только вот, сколько ни долблюсь одного не понимаю, почему делая мувик кнопкой я не могу получить инфу с атрибутов.
if (node.nodeName == 'node') {trace(node)
var message = this.attachMovie('mc', 'mc'+doc+'_'+i,
this.getNextHighestDepth());
message.txt.autoSize = true;
message.txt_var = node.attributes['label'];
message._y = startY;
message.onPress=function(){
_root.txt= node.attributes['label'];
}
startY+=30;
i++;
}
node = node.nextSibling;
}
}
}

Wolsh
24.01.2009, 20:33
Потому что node нет ни в кнопке, ни в руте. Эта переменная существует только в обработчике загрузки и только пока выполняется функция. Проще говоря, недоступна.
Так что нужен механизм для связывания кнопок и нодов - либо запоминать всю инфу прямо в свойствах кнопки message (собственно, лейбл у вас и сохраняется в переменной message.txt_var - кстати, что за допотопный способ? почему не message.txt.text?) - либо все ноды хранить в массиве, в кнопках сохранять индексы по которым искать ноды - это на случай, если инфы в одном ноде много и сохранять всю в переменных кнопки не оптимально.
И вот...
_root.txt.text = this.txt_var;

KiL33
24.01.2009, 21:03
message.txt_var - кстати, что за допотопный способ? почему не message.txt.text?
Честно говоря, я не замечал разницы. А она вообще есть?

KiL33
29.01.2009, 16:20
Ещё одна проблема.
По мере необходимости мне нужно удалять xml’ки и удаляю я их не по порядку, а в разброс, т.е. допустим xml’ок 10 я удаляю пятую и вот здесь возникает проблема, если обрывается порядковая цепочка цифр то xml’ки считаются только до 4 хотя после 4 идут еще 6 7 8 9 10 xml’ок.

Можно с этим что-то сделать?

Wolsh
30.01.2009, 00:01
Хранить имена xml-ок в хмлке-реестре. Сначала грузить ее, и из нее уже по именам - собственно хмлки с данными.

KiL33
30.01.2009, 17:44
На волне хорошего настроения, стихийно просто, начал разбираться с советом Wolsh'a и всё бы хорошо да вот только в процессе сего озарение меня посетило)))

Дело в том что xml я добавляю и удаляю не сам, а автоматом. Добавить имя xml в xml-реестр не составит труда, а вот удалять выборочно уже проблема.

Взять к примеру мой вариант, как изначально хотел сделать. Есть цикл, который перебирает xml и пусть 100xml'ок будет предел, но ему плевать на то, что после 4 нет 5, до сотой он подгрузит все xml которые есть, конечно, в отличие от прекрасного примера Wolsh'а будет ограничение, но такой вариант я считаю в своем случае более удобным что ли, хотя и он не выходит, так как грузится только одна xml.
Вот такая вот стена бетонная.

Для более ясной картины привиду исходник, я его размещал, но этот несколько переработанный. В мувике page грузится структура xml.

Molecula
30.01.2009, 21:15
Что-то не помойму, зачем хранить кол-во ХМЛек в ХМЛле.
Вы получили список ХМЛей = [] и грузите по порядку массива.
Потом, загруженное постепенно вносите в другой массив.
Потом удаляете, например, 4-ую структуру - так и удалите из массива 4(5) элемент через splice.
Так же?

KiL33
31.01.2009, 11:21
Что-то не помойму, зачем хранить кол-во ХМЛек в ХМЛле.

Это запись id каждой xml. Для дальнейшего распознания и удаления xml.
Мне так удобнее:)
А что вы думаете по поводу проблемы в 10 посте?:)