Hilfe beim Auslesen einer XML Datei

Resu

Grünschnabel
Hallo zusammen.

Irgendwie will ich nicht weiterkokmmen. Vielleicht ist der Fehler auch sehr lapidal, aber ich komm einfach nicht dahinter. Mein Code sieht folgendermassen aus:

Code:
var xarray:Array;
var yarray:Array;
var Traffic:Array;

// create XML object
var contentXML:XML = new XML(); 
// ignore carriage returns betweens lines
contentXML.ignoreWhite = true; 
// load the XML document into the XML object
contentXML.load("global.xml"); 

// specify function to call once XML is loaded
contentXML.onLoad = function(success) {
	if (success) {
		//X-Achse auslesen
		xarray = new Array(this.childNodes[0].childNodes[0].childNodes.length);
		for (var x:Number = 0; x < this.childNodes[0].childNodes[0].childNodes.length; x++) {
			xarray.push(this.childNodes[0].childNodes[0].childNodes[x].attributes["value"]);
		}
		//Y-Achse auslesen
		yarray = new Array(this.childNodes[0].childNodes[1].childNodes.length);
		for (var y:Number = 0; y < this.childNodes[0].childNodes[1].childNodes.length; y++) {
			yarray.push(this.childNodes[0].childNodes[1].childNodes[y].attributes["value"]);
		}
		
		//Trafficwerte auslesen		
		Traffic = new Array(this.childNodes[1].childNodes.length);
		for (var i:Number = 0; i < this.childNodes[1].childNodes.length; i++) {
			Traffic[i] = new Array(5);
			Traffic[i][0] = this.childNodes[1].childNodes[i].attributes["value"];	//Anzahl Pakete
			Traffic[i][1] = this.childNodes[1].childNodes[i].childNodes[0].attributes["value"];	//from
			Traffic[i][2] = this.childNodes[1].childNodes[i].childNodes[1].attributes["value"];	//to
		}	
	}
}

Das Auslesen klappt soweit auch wunderbar. Und innerhalb der onLoad Funktion kann ich auch ohne Probleme auf meine Arrays zugreifen. Nur mache ich dann ein trace(xarray) ausserhalb des onLoads, sind keine Daten mehr vorhanden und es erscheint nur ein "undefined". Ich habe jetzt schon mehrere Themen durchgelesen, aber nichts hat mir weitergeholfen. Auch statische Funktionen/Variablen haben nichts gebracht, da das ganze dynamisch sein muss und ich alle Werte später brauche und auch wieder erneuern will. Mein Ziel ist es auch, eine XML-Auslesefunktion in eine eigene Klasse einzubauen. Aber solange das genannte Problem besteht, funktionert das natürlich auch nich.

Ich hoffe ihr könnt mir dabei helfen, ist ziemlich dringend... danke!
 
Noch etwas: Der Zugriff contentXML.childNodes... funktionert nach dem Laden ebenfalls nicht. Als Anzahl geladene Bytes wird mir auch 0 ausgegeben. Ich weiss nicht woran es liegt, aber die Daten scheinen nur temporär geladen und danach gleich wieder gelöscht zu werden. Was ich aber nicht möchte... btw ich arbeite mit Flash MX 2004.
 
Hi,

versuchs mal mit
Code:
var xarray:Array = new Array();
var yarray:Array = new Array();
var Traffic:Array = new Array();

@childNodes: Sagt mir jetzt nicht viel. Wo und wann versuchst Du denn auf die Knoten zuzugreifen?

Gruß
.
 
das "= new Array" mache ich bereits im onLoad; benutze die Länge der childNodes um die Länge des Array beim Erzeugen direkt zu definieren.

Jede "childNode" ist eine Stufe der XML Hierarchie der Datei, aber darauf kommt es nicht an, das funktioniert einwandfrei.

Das Problem ist, dass die Daten nur temporär vorhanden sind. Ich kann sie zwar direkt aus dem onLoad heraus verwenden und damit Objekte, usw. erzeugen, jedoch kann ich die Werte keinen globalen oder lokalen Variabeln zuordnen. Könnte mir vorstellen, dass, weil der Rückgabewert des onLoad auch ein Objekt ist, dies alle Referenzen überschreibt oder blockiert. Aber wie komme ich darum herum?
 
Hi,

@Array: stimmt, habe ich übersehen. :-(

@Inhalt: Die Daten sind schon dauerhaft vorhanden (im XML-Objekt); Du sollest sie nach dem onLoad durchaus auch globalen Variablen etc. zuweisen können. In dem onLoad-Handler verweise this natürlich auf das XML-Objekt - allerdings geht der Zugriff auf ausserhalb der Funktion definierte Variablen natürlich dennoch. Ich kann auf den ersten und zweiten Blick keinen großartigen Fehler in Deinem Script erkennen. Die Variablen lassen sich in der Funktion mit trace() alle ausgeben?

Poste bitte mal ein Beispiel einer solchen Übergabe bzw. der Verwendung der Variablen ausserhalb von onLoad, die nicht funktioniert.

Gruß
.
 
Ich habe in einem andere Forum gerade eine Antwort erhalten: das Problem liegt darin, dass ich den zeitlichen Ablauf nicht beachte. Ich programmiere immer dem Code nach, und habe bei Flash die Zeit vergessen. Bin relativ neu in Flash mit AS... Ich müsste eine Funktion im onLoad aufrufen, und sobald die aufgerufen wird, sind die Daten auch geladen. Also wie folgt:

Code:
contentXML.onLoad = function(success) {
	if (success) {
//X-Achse auslesen
		xarray = new Array(this.childNodes[0].childNodes[0].childNodes.length);
		for (var x:Number = 0; x < this.childNodes[0].childNodes[0].childNodes.length; x++) {
			xarray.push(this.childNodes[0].childNodes[0].childNodes[x].attributes["value"]);
		}
                nextFunction();
        }

}

function nextFunction() {
       trace(xarray);
}

Ich werde das morgen testen. Hoffentlich klappts!
 
Hi,

so etwas habe ich mir schon gedacht, aber ich bin davon ausgegangen, dass Du schon auf das onLoad-Ereignis wartest. Mit dieser Modifikation sollte es allerdings funktionieren. ;)

Gruß
.
 
In einer einfachen FLA geschrieben funktioniert das jetzt problemlos...

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

Code:
private function buildMatrix() {
        trace("build");
        var tempXML:XML = new XML();
        tempXML.ignoreWhite = true;
        switch(_global.state) {
                case "global":	tempXML.load("global.xml");
                break;
        }
        tempXML.onLoad = function(success) {
                if  (success) {
                        //X-Achse auslesen
                        var x_xml = this.childNodes[0].childNodes[0].childNodes;
                        AbszisseTo = [];
                        for (var x = 0; x<x_xml.length; x++) {
                                AbszisseTo.push(x_xml[x].attributes.value);
                        }
                        trace(AbszisseTo);
                        loadedMatrix();
                        delete(tempXML);
                } else {
                        trace("error");
                }
        }
}

private function loadedMatrix() {
        trace("loaded");
        trace(AbszisseTo);
}

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 !!
 
Hab mir jetzt was zusammengebastelt. Meine Klasse extends XML ! habe dann die onLoad Funktion überschrieben und neue funktionen erstellt, welche ich so aufrufen kann. Weshalb es so funktioniert, und der andere Weg nicht, bleibt mir ein Rätsel. Wäre dankbar, wenn mir das jemand trotzdem noch lösen könnte?
 
Hmm,

durch die lokal definierte Funktion onLoad hast Du tatsächlich keinen Zugriff mehr auf Klassenmitglieder. :eek: (ich muss zugeben: das ist mir noch nicht untergekommen).

Lösung:

Referenziere die Klasseninstanz ebenfalls in einer lokalen Variable:
Code:
private function buildMatrix() {
        trace("build");
        var that = this;
und verwende sie, um auf die Member der Klasse zu zeigen, wenn Du Dich in dem onLoad-Handler befindest:
Code:
that.AbszisseTo = [];
// und etwas später:
that.push(x_xml[x].attributes.value);
// und dann auch beim Funktionsaufruf:
that.loadedMatrix();

Gruß
.
 
Zurück