FLEX: XML в массив данных? - PullRequest
       8

FLEX: XML в массив данных?

0 голосов
/ 20 января 2010

Мне нужно получить контроль над массивами и данными XML, но у меня возникают проблемы с пониманием того, как превратить данные XML в полезные данные. Я надеялся, что эти форумы могут дать некоторое представление.

Я загружаю свой XML с этим кодом:

//set values for XML data file
private var XML_URL:String = "http://www.mysite.com/media/locXML.xml";
private var locXML:XML = new XML();

private function getXMLdata():void
{
    var locXMLURL:URLRequest = new URLRequest(XML_URL);
    var locXMLLoader:URLLoader = new URLLoader(locXMLURL);
    locXMLLoader.addEventListener("complete", xmlLoaded);

    function xmlLoaded(event:Event):void
    {
        locXML = XML(locXMLLoader.data);
        trace("Data loaded. " + locXML);
    }
}

Я пытаюсь преобразовать следующий код в массив, заполненный этими данными XML. Везде, где вы видите '[]', мне нужно, чтобы номер совпадал с записью номера файла locXML ...

    for each (var point[]:XML in locXML.location)
    {
        pointMarker] = new PointMarker();
        pointMarker[].buttonMode = pointMarker[].useHandCursor = true;
        var image[]:Loader = new Loader();
        image[].load(image[]Req, context);
        image[].x = -iconHeight/2;
        image[].y = -iconWidth/2;
        if (pointMarker[]_motion == true)
        {
            var iconShimmer[]:MovieClip = new IconShimmer() as MovieClip;
            iconShimmer[].x = image[].x;
            iconShimmer[].y = image[].y;
            pointMarker[].addChild(image[]);
            pointMarker[].addChild(iconShimmer[]);
            pointMarker[].pointName[] = point[].name;
            pointMarker[].name = imageBubbleFile[];
        }else{
            pointMarker[].addChild(image[]);
            pointMarker[].pointName[] = point[].name;
            pointMarker[].name = imageBubbleFile[];
        }
        pointMarker[].pointDesc[] = point[].description;
        _map.putMarker(new Location(point[].lat, point[].long), pointMarker[]);
        pointMarker[].addEventListener(MouseEvent.CLICK, pointMarker[]_Click);
        pointMarker[].addEventListener(MouseEvent.ROLL_OVER, pointMarker[]_RO);
        pointMarker[].mouseChildren=false;
    }       
}
}

Вот небольшой фрагмент XML-файла:

<?xml version="1.0" encoding="utf-8"?>
<root>
<!--~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~-->
<location ID="maplogo">
<name>mapLogo</name>
<lat>31.3731712263342</lat>
<long>-94.08871702323849</long>
<iconFile>town.jpg</iconFile>
<imageFile>type1.swf</imageFile>
<motion>false</motion>
</location>
<!--~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~-->
<location ID="bigstarsupermarket">
<name>Big Star Supermarket</name>
<lat>31.5664202</lat>
<long>-93.4904959</long>
<iconFile>bigStar.jpg</iconFile>
<imageFile>type1.swf</imageFile>
<motion>false</motion>
</location>
<!--~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~-->
</root>

как я могу это сделать, не занимая 2000 строк кода? Я жестко кодировал число в каждой из этих скобок '[]', но это становится очень кропотливым ...?

EDIT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ EDIT Я изменил его, где он будет зацикливаться при разборе XML. но генерируется ошибка для каждого этого типа форматирования ["icon" + XMLpCounter]

    public function parseLocXML(nodeName:String, lat:Number, 
         long:Number, iconFile:String, 
         imageFile:String, motion:String):void

    {   
        if (XMLpCounter==0)
        {
        //addMarkers();
        //trace(arguments);
        //trace("--- drawMap ---");
        //trace(arguments.join("\r"));
        XMLpCounter++;
        } else {
        XMLpCounter++;

        //----------------------------------------------------------------------------------------
        var this.["icon"+XMLpCounter]:Loader = new Loader();
        var this.["iconFileLink"+XMLpCounter]:String = mediaLoc + locXML.location.iconFile[XMLpCounter];
        var this.["iconFile"+XMLpCounter+"Req"]:URLRequest = new URLRequest(iconFileLink[XMLpCounter]);
        ["imageFileLink"+XMLpCounter] = mediaLoc + locXML.location.imageFile[XMLpCounter];
        ["imageFile"+XMLpCounter+"Req"] = new URLRequest(imageFileLink[XMLpCounter]);
        ["locPointMarker"+XMLpCounter] = new PointMarker();
        ["locPointMarker"+XMLpCounter].buttonMode = ["locPointMarker"+XMLpCounter].useHandCursor = true;

        ["icon"+XMLpCounter].load(["iconFile"+XMLpCounter+"Req"], context);
        ["icon"+XMLpCounter].x = -iconHeight/2;
        ["icon"+XMLpCounter].y = -iconWidth/2;

and so on
}

ОШИБКИ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~ ОШИБКИ

var ["icon" + XMLpCounter]:Loader = new Loader();//1084: Syntax error: expecting identifier before left bracket. & 1084: Syntax error: expecting identifier before right bracket.
//var iconFileLink1:String;
//var iconFile1Req:URLRequest;
//var imageFileLink1:String;
//var imageFile1Req:URLRequest;
//obtain from XML the icon for map
var ["iconFileLink"+XMLpCounter]:String = mediaLoc + locXML.location.iconFile[XMLpCounter];//1084: Syntax error: expecting identifier before left bracket. & 1084: Syntax error: expecting identifier before right bracket.
var ["iconFile"+XMLpCounter+"Req"]:URLRequest = new URLRequest(iconFileLink[XMLpCounter]);//1084: Syntax error: expecting identifier before plus. & 1084: Syntax error: expecting identifier before left bracket.
//obtain from XML the ad for bubble
["imageFileLink"+XMLpCounter] = mediaLoc + locXML.location.imageFile[XMLpCounter]; //1084: Syntax error: expecting identifier before assign.
["imageFile"+XMLpCounter+"Req"] = new URLRequest(imageFileLink[XMLpCounter]);//1084: Syntax error: expecting identifier before assign.
["locPointMarker"+XMLpCounter] = new PointMarker();//1084: Syntax error: expecting identifier before assign.
["locPointMarker"+XMLpCounter].buttonMode = ["locPointMarker"+XMLpCounter].useHandCursor = true;//1084: Syntax error: expecting identifier before dot.

["icon"+XMLpCounter].load(["iconFile"+XMLpCounter+"Req"], context);//1084: Syntax error: expecting identifier before dot.
["icon"+XMLpCounter].x = -iconHeight/2;//1084: Syntax error: expecting identifier before dot.
["icon"+XMLpCounter].y = -iconWidth/2;//1084: Syntax error: expecting identifier before dot.

EDIT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~ EDIT Кажется, сейчас все работает, кроме двух вопросов. В последнем бите кода он добавляет прослушиватели событий для каждого маркера; когда цикл достигает следующих строк кода, он выдает ошибку (как показано ниже):

dict["locPointMarker"+i.toString()].addEventListener(MouseEvent.CLICK, ["locPointMarker"+ i.toString()+"_Click"]);
dict["locPointMarker"+i.toString()].addEventListener(MouseEvent.ROLL_OVER, ["locPointMarker"+i.toString()+"_RO"]);

Я также пробовал этот код следующим образом:

dict["locPointMarker"+i.toString()].addEventListener(MouseEvent.CLICK, ["locPointMarker_Click"+ i.toString()]);
dict["locPointMarker"+i.toString()].addEventListener(MouseEvent.ROLL_OVER, ["locPointMarker_RO"+i.toString()]);

Ошибка # 1034: сбой приведения типа: невозможно преобразовать [] @ 1488bac1 в функцию.

Что я хотел бы сделать, это пропустить эти две последние строки и затем добавить обработчики событий в цикл в конце. может быть, посылая им аргументы или что-то в этом роде ... Это возможно?

Ответы [ 3 ]

1 голос
/ 21 января 2010

Я думаю, это будет работать. Перед циклом for создайте свой итератор var.

var i:number = 0;

в вашем цикле for вызовите ваши переменные следующим образом

["pointMarker" + i]. // on first pass this should evaluate to pointMarker0, on second pointMarker1, etc.

В конце вашего цикла добавьте

i++;

РЕДАКТИРОВАТЬ 2/22: Хорошо, так что я только что понял, что словарь - способ пойти по этому пути, следуя этому примеру:

private function init():void{
    var dict:Object = new Object();
    var i:Number = 0;
    var e:Number = 100;
    for(i;i<e;i++){
        dict["blah" + i.toString()] = i;
    }
    trace(dict["blah3"]); //returns 3
    trace(dict.blah23);//returns 23
}
1 голос
/ 20 января 2010

Я бы предложил создать переменную, представляющую счетчик, начинающийся с 0, и увеличивать его при каждом запуске цикла for.Затем вы можете использовать счетчик для адресации записи в массиве.

Глядя на ваш код, я даже не уверен, действительно ли вам нужно обращаться к записям массива.Я думаю, что было бы лучше создать экземпляр PointMarker в цикле for, а затем поместить его в массив в конце каждого цикла цикла.

var pointMarkers:Array = [];

for each (var locationXML:XML in locXML.location) {
    var pointMarker:PointMarker = new PointMarker();
    pointMarker.buttonMode = pointMarker.useHandCursor = true;
    ...
    pointMarkers.push(pointMarker);
}       
0 голосов
/ 21 января 2010

Мне трудно понять, как превратить данные XML в полезные данные.

С e4x в ActionScript XML-данные очень полезны. У меня есть целые приложения, которые работают с переменными XML, взятыми со страницы XML, очень похожей на вашу. Скорость и способность запрашивать XML облегчают работу.

Я думаю, вы должны просто придерживаться данных в формате XML, если вам нужны конкретные данные из данных, просто запросите их. В этом примере будет изменен источник изображения значка на town.jpg

iconImage.source =  locXML.location.(@ID=="maplogo").iconFile;
...