2010-01-20 2 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 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~ 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 
} 

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

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: Тип Принуждение failed: невозможно преобразовать [] @ 1488bac1 в функцию.

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

+0

Можете ли вы сообщить подробности об ошибке? – invertedSpear

+0

Я отредактировал это сообщение, чтобы указать на ошибки – Phil

+0

Проверьте мой последний отредактированный ответ – invertedSpear

ответ

1

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

var i:number = 0; 

в вашей цикл называть переменные как этот

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

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

i++; 

EDIT 2/22: Хорошо, так что я просто понял, что dictionary is the way to this follow this lead:

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

+0

круто, отправляйте назад с успехом или отсутствием, поэтому мы можем помочь вам в дальнейшем, если потребуется. – invertedSpear

+0

Ну, я пробовал это несколькими способами, и у меня возникла проблема с созданием переменных ... например: var ["loader" + i]: loader; не будет работать – Phil

1

Я бы предложил создать переменную, представляющую счетчик, начинающийся с 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

Мне нужны другие переменные, чтобы иметь соответствующие числа, такие как: pointMarker []. PointName [] = point []. Name; pointMarker []. Name = imageBubbleFile []; – Phil

0

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

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

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

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

этот метод, похоже, мне пришлось бы набирать (@ID == "maplogo :) в мой файл flex, вместо этого просто бросая в новый XML-файл с тем же именем, но разные данные ... это правда? Я добавляю и удаляю местоположения каждую неделю, если не 2-3 раза в неделю.Я предпочел бы изменить XML и поместить его в папку с файлом. – Phil

+0

Я думаю, что я могу не понимать, каковы ваши намерения. Также этот пример был просто для того, чтобы показать, как вы запрашиваете XML с помощью e4x: вы заполняете список или что-то с вашим XML-файлом? – invertedSpear

+0

моя программа помещает маркеры на карту. Все маркеры идентифицируются XML-файлом (lat/long, icon, infoBubble и т. д.) Мне нужно создать переменные с данные в xml или просто использовать данные как есть. Я могу загружать данные и отслеживать данные ... но оттуда я не знаю, как разделить данные на различные переменные – Phil

Смежные вопросы