2010-01-20 21 views
0

我需要掌握數組和XML數據,但我無法理解如何將xml數據轉換爲有用的數據。我希望這些論壇可以提供一些見解。FLEX: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 我把它改成它在xml解析過程中會循環的地方。但對於每個這種類型的格式化的[ 「圖標」 + 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 
} 

ERRORS產生一個錯誤~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~錯誤

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. 

編輯~~~~ 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜編輯 除了兩個問題之外現在正在工作。 在代碼的最後一位,它將事件監聽器添加到每個標記;當環路到達下面的代碼行,它引發錯誤(以下代碼示出):

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轉換爲函數。

我想要做的是省略那兩個最後一行,然後在最後一個循環中添加事件監聽器。也許通過向他們發送參數或其他東西...這可能嗎?

+0

你能發佈錯誤的細節嗎? – invertedSpear 2010-02-22 19:52:25

+0

我編輯了上面的帖子來指出錯誤 – Phil 2010-02-22 23:41:23

+0

檢查我最近編輯的答案 – invertedSpear 2010-02-23 00:33:32

回答

1

我認爲這將起作用。 在您的for循環之前創建您的迭代器變種。

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 
} 
+0

我將在本週末嘗試。 – Phil 2010-01-29 16:47:51

+0

很酷,發回你的成功,或缺乏,所以我們可以幫助你,如果需要我們進一步。 – invertedSpear 2010-01-29 17:36:03

+0

以及我已經在很多方面嘗試了這一點,並且我在創建變量時遇到了問題...例如: var [「loader」+ i]:loader;將不會工作 – Phil 2010-02-22 13:01:22

1

我建議創建一個變量來表示一個從0開始的計數器,並在for循環中每次運行時增加它。然後,您可以使用計數器來解決陣列中的條目。

看着你的代碼,我甚至不知道你是否真的需要處理數組條目。我認爲最好在for循環中創建一個PointMarker實例,然後在循環的每次運行結束時將它推到數組上。

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

我其實需要其他變量來匹配這樣的數字: pointMarker [] .pointName [] = point []。name; pointMarker []。name = imageBubbleFile []; – Phil 2010-01-20 22:16:40

0

I'm having trouble understanding how to turn xml data into useful data.

在ActionScript XML數據的E4X是非常有用的。我有整個應用程序運行XML變量,從XML頁面採取很像你的。查詢XML的速度和能力使其易於使用。

我認爲你應該堅持使用XML格式的數據,如果你需要從數據中獲得特定的東西,只需要將它們查詢出來。這個例子會將圖標圖像的來源更改爲town.jpg

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

這個方法好像我必須在我的flex文件中輸入(@ID ==「maplogo :),而不是簡單地放入一個新的具有相同名稱但不同數據的XML文件......是真的嗎?我添加和刪除位置每週如果不是每週2-3次,我寧願更改XML並將其放在文件位置 – Phil 2010-01-20 22:17:35

+0

我想我可能會誤解你的意圖,這個例子只是爲了展示如何查詢XML e4x。您是否使用XML文件填充列表或其他東西? – invertedSpear 2010-01-20 22:42:00

+0

我的程序在地圖上放置了標記。標記全部由XML文件(緯度/長度,圖標圖像,infoBubble等)標識,我需要用變量創建變量我可以加載數據並跟蹤數據...但是從那裏我不知道如何將數據分離到各種變量 – Phil 2010-01-20 23:20:04