2010-01-20 4 views
0

J'ai besoin de comprendre les tableaux et les données XML, mais j'ai de la difficulté à comprendre comment transformer les données xml en données utiles. J'espérais que ces forums pourraient fournir un aperçu.FLEX: XML vers le tableau de données?

Je charge mon XML avec ce code:

//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); 
    } 
} 

Je suis en train de faire le code suivant dans un tableau contenant la que les données XML. Partout où vous voyez un « [] » J'ai besoin du numéro pour correspondre au record du nombre du fichier 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; 
    }  
} 
} 

est ici un petit extrait du fichier 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> 

comment peut Je fais cela sans prendre jusqu'à 2000 lignes de code? J'ai codé un chiffre dans chacune de ces parenthèses [], mais cela devient très laborieux ...?

EDIT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ EDIT je l'ai changé à l'endroit où il bouclera pendant l'analyse du xml. mais une erreur est générée pour chacun de ce type [ "formating icône" + 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 
} 

ERREURS ~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ERREURS

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 Tout semble travailler maintenant, sauf pour deux problèmes. Au dernier bit du code, il ajoute des écouteurs d'événement à chaque marqueur; lorsque la boucle obtient les lignes de code ci-dessous, il renvoie une erreur (ci-dessous le code):

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

J'ai aussi essayé ce code comme suit:

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

Erreur # 1034: Type Coercion Échec: impossible de convertir [] @ 1488bac1 en fonction.

Ce que je voudrais faire est de ces deux dernières omettent des lignes, puis ajoutez les écouteurs d'événement dans une boucle à la fin. peut-être en leur envoyant des arguments ou quelque chose ... Est-ce possible?

+0

Pouvez-vous poster les détails de l'erreur? – invertedSpear

+0

J'ai édité le message ci-dessus pour indiquer les erreurs – Phil

+0

Vérifiez ma dernière réponse éditée – invertedSpear

Répondre

1

Je pense que cela va fonctionner. Avant votre boucle for, créez votre var itérateur.

var i:number = 0; 

dans votre boucle appeler vos variables comme celui-ci

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

A la fin de la boucle ajouter

i++; 

EDIT 2/22: Ok donc je viens de réaliser que dictionnaire est la voie à suivre sur ce suivre cette piste:

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

Je vais essayer ce week-end. – Phil

+0

cool, de retour avec votre succès, ou le manque de, afin que nous puissions vous aider plus loin si nécessaire. – invertedSpear

+0

Eh bien, j'ai essayé cela de plusieurs façons et j'ai un problème pour créer les variables ... par exemple: var ["loader" + i]: loader; ne fonctionnera pas – Phil

1

Je suggère de créer une variable représentant un compteur à partir de 0 et incrémenter avec chaque cycle dans la boucle. Vous pouvez ensuite utiliser le compteur pour adresser l'entrée dans le tableau.

En regardant votre code, je ne suis même pas sûr si vous avez vraiment besoin de traiter les entrées de tableau. Je pense qu'il serait préférable de créer une instance de PointMarker dans la boucle for, puis de l'insérer dans le tableau à la fin de chaque cycle de la boucle.

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

J'ai réellement besoin d'autres variables pour avoir des nombres correspondants comme ceci: pointMarker []. PointName [] = point []. Name; pointMarker []. Name = imageBubbleFile []; – Phil

0

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

Avec le e4x des données XML actionscript est très utile. J'ai des applications entières qui fonctionnent à partir de variables XML, prises à partir d'une page XML semblable à la vôtre. La vitesse et la capacité d'interroger le XML facilitent le travail.

Je pense que vous devriez juste coller avec les données au format XML, si vous avez besoin des choses spécifiques à partir des données, il suffit de les interroger sur.Cet exemple changerait la source de l'image d'icône à town.jpg

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

cette méthode semble que je devrais taper (@ID == "maplogo :) dans mon fichier flex au lieu de simplement déposer dans un nouveau fichier XML avec le même nom mais des données différentes ... est-ce vrai? J'ajoute et supprime des emplacements Chaque semaine, sinon 2-3 fois par semaine, je préfère changer le XML et le déposer dans l'emplacement du fichier – Phil

+0

Je pense que je peux mal comprendre quelle est votre intention.Est aussi cet exemple était juste pour montrer comment vous interrogez XML avec e4x.Est-ce que vous remplissez une liste ou quelque chose avec votre fichier XML? – invertedSpear

+0

mon programme place des marqueurs sur une carte.Les marqueurs sont tous identifiés par le fichier XML (lat/long, icône image, infoBubble, etc) J'ai besoin de créer des variables avec les données dans le xml ou simplement utiliser les données telles quelles.Je peux charger les données et tracer les données ... mais à partir de là, je ne sais pas comment séparer les données dans ses différentes variables – Phil

Questions connexes