2010-01-20 24 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