Zurück   Flashforum > Flash > Flash Fortgeschritten > Flash MX 2004

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 28-07-2005, 19:26   #1 (permalink)
Neuer User
 
Registriert seit: Jul 2005
Beiträge: 6
Exclamation Problem beim Auslesen einer XML Datei

Ich habe folgendes Problem:

Ich lese mit Hilfe eines XML Objektes eine entsprechende Datei aus. Durch eine onLoad Funktion des Objektes komme ich an den Dateiinhalt (über childNodes), und das ohne Probleme. Nun ich habe schon alle möglichen Themen hier durchgelesen, doch mir hilft nichts explizit weiter.

Das Problem: Ich kann die Daten zwar auslesen, aber keiner lokalen oder globalen Variablen zuweisen, damit ich die Daten für andere Zwecke verwenden kann. Könnte eventuell daran liegen, dass beim onLoad ein eigenes referenziertes Objekt zurgeliefert wird, aber wie umgehe ich das? Einige Themen über static functions + Variables haben mir nicht weitergeholen.

Hier ist der Code:
ActionScript:
  1. var xarray:Array;
  2. var yarray:Array;
  3. var Traffic:Array;
  4.  
  5. // create XML object
  6. var contentXML:XML = new XML();
  7. // ignore carriage returns betweens lines
  8. contentXML.ignoreWhite = true;
  9. // load the XML document into the XML object
  10. contentXML.load("global.xml");
  11.  
  12. // specify function to call once XML is loaded
  13. contentXML.onLoad = function(success) {
  14.     if (success) {
  15.         //X-Achse auslesen
  16.         xarray = new Array(this.childNodes[0].childNodes[0].childNodes.length);
  17.         for (var x:Number = 0; x < this.childNodes[0].childNodes[0].childNodes.length; x++) {
  18.             xarray.push(this.childNodes[0].childNodes[0].childNodes[x].attributes["value"]);
  19.         }
  20.         //Y-Achse auslesen
  21.         yarray = new Array(this.childNodes[0].childNodes[1].childNodes.length);
  22.         for (var y:Number = 0; y < this.childNodes[0].childNodes[1].childNodes.length; y++) {
  23.             yarray.push(this.childNodes[0].childNodes[1].childNodes[y].attributes["value"]);
  24.         }
  25.        
  26.         //Trafficwerte auslesen  
  27.         Traffic = new Array(this.childNodes[1].childNodes.length);
  28.         for (var i:Number = 0; i < this.childNodes[1].childNodes.length; i++) {
  29.             Traffic[i] = new Array(5);
  30.             Traffic[i][0] = this.childNodes[1].childNodes[i].attributes["value"];   //Anzahl Pakete
  31.             Traffic[i][1] = this.childNodes[1].childNodes[i].childNodes[0].attributes["value"]; //from
  32.             Traffic[i][2] = this.childNodes[1].childNodes[i].childNodes[1].attributes["value"]; //to
  33.         }   
  34.     }
  35. }
  36.  
  37. trace(xarray)//ergibt undefined
  38.  

Detail: die Zuweisung der childNodes-Inhalte an die Arrays funktioniert wunderbar, solange ich die Daten nur im onLoad Teil verwenden will. Möchte ich aber danach das "trace(xarray)" ausserhalb ausführen, kommt nur "undefined" heraus und nicht die gewünschten Daten.

Ich hoffe, mir kann jemand helfen, benötige dringend eine Lösung für unser Projekt. Danke!
resu ist offline   Mit Zitat antworten
Alt 28-07-2005, 19:42   #2 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.326
herzlichen glückwunsch, du bist der 3millionste forumbesucher mit exakt dieser frage.

du führst dein
trace(xarray); //ergibt undefined
aus, bevor flash überhaupt eine chance gehabt hatte die daten zu laden.

if (success) {
ab da stehen die daten zur verfügung.

beachte den zeitlichen ablauf und nicht, weil irgendetwas weiter unten im script steht würde es auch später ausgeführt. die function onLoad (wozu wäre die auch sonst da) wird erst ausgeführt, nachdem die daten geladen wurden.
ActionScript:
  1. var xarray:Array;
  2. var yarray:Array;
  3. var Traffic:Array;
  4. // create XML object
  5. var contentXML:XML = new XML();
  6. // ignore carriage returns betweens lines
  7. contentXML.ignoreWhite = true;
  8. // load the XML document into the XML object
  9. contentXML.load("global.xml");
  10. // specify function to call once XML is loaded
  11. contentXML.onLoad = function(success) {
  12.     if (success) {
  13.         //X-Achse auslesen
  14.         var x_xml = this.childNodes[0].childNodes[0].childNodes;
  15.         xarray = [];
  16.         for (var x = 0; x<x_xml.length; x++) {
  17.             xarray.push(x_xml[x].attributes.value);
  18.         }
  19.         //Y-Achse auslesen
  20.         var y_xml = this.childNodes[0].childNodes[1].childNodes;
  21.         yarray = [];
  22.         for (var y = 0; y<y_xml.length; y++) {
  23.             yarray.push(y_xml[y].attributes.value);
  24.         }
  25.         //Trafficwerte auslesen
  26.         var t_xml = this.childNodes[1].childNodes;
  27.         Traffic = [];
  28.         for (var i = 0; i<t_xml.length; i++) {
  29.             Traffic[i] = [];
  30.             Traffic[i].push(t_xml[i].attributes.value);
  31.             //Anzahl Pakete
  32.             Traffic[i].push(t_xml[i].childNodes[0].attributes.value);
  33.             //from
  34.             Traffic[i].push(t_xml[i].childNodes[1].attributes.value);
  35.             //to
  36.         }
  37.          fJetztGehtsLos();
  38.     } else {
  39. // fehlermeldung, keine daten bekommen!
  40. }
  41.  
  42. };
  43. function fJetztGehtsLos() {
  44.     trace(xarray);
  45. }
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de

Geändert von hgseib (28-07-2005 um 19:55 Uhr)
hgseib ist offline   Mit Zitat antworten
Alt 28-07-2005, 20:35   #3 (permalink)
Neuer User
 
Registriert seit: Jul 2005
Beiträge: 6
Danke, so etwas habe ich mir schon fast gedacht, bin nur irgendwie nicht drauf gekommen, wie ich das lösen könnte. Werde mir anhand deiner Lösung etwas basteln.
resu ist offline   Mit Zitat antworten
Alt 29-07-2005, 07:41   #4 (permalink)
Neuer User
 
Registriert seit: Jul 2005
Beiträge: 6
Exclamation

Ich habe noch eine weitere Frage.

Das Ganze versuche ich nun in eine eigene Klasse einzubetten. Ich kann die Daten zwar wieder problemlos laden, jedoch kann ich dann innerhalb der Klasse nicht zu einer weitere funktion springen:

ActionScript:
  1. private function buildMatrix() {
  2.         trace("build");
  3.         var tempXML:XML = new XML();
  4.         tempXML.ignoreWhite = true;
  5.         switch(_global.state) {
  6.             case "global":  tempXML.load("global.xml");
  7.                             break;
  8.         }
  9.         tempXML.onLoad = function(success) {
  10.             if  (success) {
  11.                 //X-Achse auslesen
  12.                 var x_xml = this.childNodes[0].childNodes[0].childNodes;
  13.                 AbszisseTo = [];
  14.                 for (var x = 0; x<x_xml.length; x++) {
  15.                         AbszisseTo.push(x_xml[x].attributes.value);
  16.                 }
  17.                 trace(AbszisseTo);
  18.                 loadedMatrix();
  19.                 delete(tempXML);
  20.             } else {
  21.                 trace("error");
  22.             }
  23.         }
  24.     }
  25.    
  26.     private function loadedMatrix() {
  27.         trace("loaded");
  28.         trace(AbszisseTo);
  29.     }

das erste Trace funktioniert, aber er ruft "loadedMatrix" nicht auf. Wie kann ich das zurechtbiegen, ohne zum Beispiel alles in statischen Funktionen zu schreiben?

Die Referenzierung ist ja auch auf das XML objekt, und nicht mehr auf das erstellte Objekt. Wie komme ich zu diesem zurück?

danke für die Hilfe...



Edit: Habe es jetzt dadurch gelöst, dass meine Klasse ein extends XML hat und ich das onLoad innerhalb überschreibe und von dort aus eine private funktion aufrufe. So funktioniert es. Weshalb das andere nicht funktioniert bleibt mir ein Rätsel...

Geändert von resu (29-07-2005 um 09:00 Uhr)
resu ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an



Alle Zeitangaben in WEZ +1. Es ist jetzt 01:24 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele