Разбор XML с AS3 - PullRequest
       33

Разбор XML с AS3

0 голосов
/ 05 мая 2009

Вот весь мой сценарий, так как я не могу понять, в чем проблема.

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

var rowsW:Number;
var my_xW:Number;
var my_yW:Number;
var my_thumb_widthW:Number;
var my_thumb_heightW:Number;
var my_imagesW:XMLList;
var my_totalW:Number;

var container_mcW:MovieClip;
var preloaders_mcW:MovieClip;
var book:TextField = new TextField();
var author:TextField = new TextField();
var publisher:TextField = new TextField();
book.selectable = true;

var x_counterW:Number = 0;
var y_counterW:Number = 0;

var my_tweensW:Array = [];
var container_mc_tweenW:Tween;

var myXMLLoaderW:URLLoader = new URLLoader();

myXMLLoaderW.load(new URLRequest("WORKS.xml"));
myXMLLoaderW.addEventListener(Event.COMPLETE, processXMLW);

createContainerW();
callThumbsW();

function processXMLW(e:Event):void {
var myXMLW:XML = new XML(e.target.data);

rowsW = myXMLW.@ROWS;
my_xW = myXMLW.@XPOSITION;
my_yW = myXMLW.@YPOSITION;
my_thumb_widthW = myXMLW.@WIDTH;
my_thumb_heightW = myXMLW.@HEIGHT;
my_imagesW = myXMLW.IMAGE;
my_totalW = my_imagesW.length();

myXMLLoaderW.removeEventListener(Event.COMPLETE, processXMLW);
myXMLLoaderW = null;

}

function createContainerW():void {
container_mcW = new MovieClip();
container_mcW.x = my_xW;
container_mcW.y = my_yW;
addChild(container_mcW);


preloaders_mcW = new MovieClip();
preloaders_mcW.x = container_mcW.x;
preloaders_mcW.y = container_mcW.y;
addChild(preloaders_mcW);
}

function callThumbsW():void {
for (var i:Number = 0; i < my_totalW; i++) {

    var thumb_urlW = my_imagesW[i].@THUMB;
    book.text = my_imagesW[i].@TITLE;
    author.text = my_imagesW[i].@AUTHOR;
    publisher.text = my_imagesW[i].@PUBLISHER;

    var thumb_loaderW = new Loader();
    thumb_loaderW.load(new URLRequest(thumb_urlW));

thumb_loaderW.contentLoaderInfo.addEventListener(Event.COMPLETE,thumbLoadedW);

    thumb_loaderW.name = i;

    book.x = (40)*x_counterW;
    book.y = (my_thumb_heightW+40)*y_counterW;
    thumb_loaderW.x = (my_thumb_widthW+10)*x_counterW;
    thumb_loaderW.y = (my_thumb_heightW+10)*y_counterW;


    container_mcW.addChild(book);
    container_mcW.addChild(author);
    container_mcW.addChild(publisher);
    trace("my x equals" (book.x));

    if (y_counterW+1 < rowsW) {
        y_counterW++;
    } else {
        y_counterW = 0;
        x_counterW++;
    }
    var preloader_pbW:ProgressBar = new ProgressBar();
    preloader_pbW.source = thumb_loaderW.contentLoaderInfo;
    preloader_pbW.x = thumb_loaderW.x;
    preloader_pbW.y = thumb_loaderW.y;
    preloader_pbW.width = my_thumb_widthW;
    preloader_pbW.height = my_thumb_heightW;
    preloaders_mcW.addChild(preloader_pbW);

    preloader_pbW.addEventListener(Event.COMPLETE, donePbW);

}
}

function thumbLoadedW(e:Event):void {
var my_thumbW:Loader = Loader(e.target.loader);
container_mcW.addChild(my_thumbW);

my_tweensW[Number(my_thumbW.name)]=new Tween(my_thumbW, "alpha", Strong.easeIn, 0,1,0.5, true);

my_thumbW.contentLoaderInfo.removeEventListener(Event.COMPLETE, thumbLoadedW);
}

function donePbW(e:Event):void {
var my_pbW:ProgressBar = ProgressBar(e.target);
preloaders_mcW.removeChild(my_pbW);
my_pbW.removeEventListener(Event.COMPLETE, donePbW);
}

Ответы [ 2 ]

1 голос
/ 05 мая 2009

Мне не кажется, что вы правильно загружаете свой XML. Вы должны использовать URLLoader, а не загрузчик для загрузки XML. Затем вам нужно будет подождать, пока не будет запущен Event.COMPLETE, чтобы проанализировать данные и добавить ваши текстовые поля.

Из сефирот (http://www.sephiroth.it/tutorials/flashPHP/E4X/):

import flash.net.URLLoader
import flash.net.URLRequest
import flash.xml.XML
import flash.event.*
import flash.error.*

var mainXML:XML;
var loader:URLLoader = new URLLoader();
loader.addEventListener(Event.COMPLETE, onComplete);
loader.load(new URLRequest("http://www.sephiroth.it/tutorials/flashPHP/E4X/files/test.xml"));


function onComplete(evt:Event)
{
    mainXML = new XML(loader.data)
    trace("xml loaded, start parsing using E4X syntax");
}

Ну, теперь, когда вы массово отредактировали свой вопрос, да, очевидно, у вас уже есть это. Я бы попробовал отследить / посмотреть loader.data, прежде чем пытаться разобрать его в объект xml, чтобы увидеть, какие именно данные вы пытаетесь проанализировать в XML. Похоже, вы, возможно, получаете некоторые данные, которые вы не ожидаете.

0 голосов
/ 11 мая 2009

Причина, по которой мой код в лучшем случае отображал только один результат из списка XML, заключается в том, что я создаю экземпляр TextField вне цикла, который рисует переменную i из множества узлов XML. Чтобы правильно отобразить текстовое поле для каждого узла, мне нужно создать экземпляр TextField для каждого варианта. Как это:

function callThumbsW():void {
for (var i:Number = 0; i < my_totalW; i++) {

    var thumb_urlW = my_imagesW[i].thumb;
    var book = my_imagesW[i].TITLE;

    var textHolder:TextField = new TextField;
    container_mcW.addChild(textHolder);

Это вызывает мгновенное удовлетворение.

...