[英]FLEX: XML to data array?
我需要掌握數組和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我將其更改為在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除了兩個問題,其他所有內容現在似乎都可以正常工作。 在代碼的最后,它將事件偵聽器添加到每個標記。 當循環到達以下代碼行時,它將引發錯誤(如下代碼所示):
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轉換為Function。
我想做的是省略最后兩行,然后在循環的末尾添加事件監聽器。 也許通過向他們發送論點之類的東西...可能嗎?
我建議創建一個代表計數器的變量(從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);
}
我認為這會起作用。 在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
}
我無法理解如何將xml數據轉換為有用的數據。
隨着e4x在動作腳本中的使用,XML數據非常有用。 我有整個應用程序都使用XML變量運行,就像從您的XML頁面中提取的那樣。 查詢XML的速度和能力使其易於使用。
我認為您應該只使用XML格式的數據,如果您需要數據中的特定內容,只需查詢一下即可。 本示例將圖標圖像的來源更改為town.jpg
iconImage.source = locXML.location.(@ID=="maplogo").iconFile;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.