Matze: Flash - Klassen-Eigenschaft liefert immer null

Hallo!

Ich versuche mit ActionScript eine XML-Datei auszulesen (was auch funktioniert) und zu verarbeiten. Leider liefert mir meine Klasse immer null als Wert.
Geb ich die Variable aber in der Klasse selbst aus, stimmt der Inhalt.
Woran liegt das?

Hier der Code der Klasse:

package com {  
	  
    import flash.display.MovieClip;  
    import flash.net.URLLoader;  
    import flash.events.Event;  
    import flash.net.URLRequest;	  
	  
    public class readXMLFile {  
		  
        private var contentXMLUrl:String = "myxml.xml";  
        public var XMLContent:XMLList;  
		  
        public function readXMLFile() {  
            var xmlLoader:URLLoader = new URLLoader();  
            xmlLoader.addEventListener(Event.COMPLETE, XMLloaded);  
            xmlLoader.load(new URLRequest(contentXMLUrl));  
        }  
		  
        private function XMLloaded(e:Event):void {  
            var XMLRes:XML = new XML(e.currentTarget.data);  
            XMLRes.ignoreWhite = true;  
            // nur Elementbaum mit "myElements"  
            this.XMLContent = XMLRes.myElements;  
            // gibt mir die XMLListe aus - das klappt hier  
            trace(this.XMLContent);  
        }		  
    }	  
}

So wird die Klasse aufgerufen:

import com.readXMLFile;  
  
var foo:readXMLFile = new readXMLFile();  
// hier bekomme ich null als Wert  
trace(foo.XMLContent);

Was mich auch verwundert, ist die Reihenfolge der Ausgaben.
Zuerst bekomme ich null vom zweiten trace() (also trace(foo.XMLContent), danach die gewünschte XML-Liste (von trace(this.XMLContent); in der Klasse).

Meines Verständnisses nach sollte aber erst der Teil in der Klasse ausgeführt werden, dann erst die Abfrage nach dessen Eigenschaften.

Wo liegt hier mein Fehler?

Danke und Grüße, Matze

  1. Hallo Matze,

    Wo liegt hier mein Fehler?

    Flash reagiert auf Programmierfehler gerne mit äußerst absurdem Verhalten. Vielleicht löst es dein Problem schon, wenn du die Klasse und die zugehörige Methode zum Lesen der XML-Datei *nicht* gleich nennst?

    Grüße
    Richard

    1. Hallo Richard,

      Flash reagiert auf Programmierfehler gerne mit äußerst absurdem Verhalten. Vielleicht löst es dein Problem schon, wenn du die Klasse und die zugehörige Methode zum Lesen der XML-Datei *nicht* gleich nennst?

      du meinst so?

      public class readXMLFile {
      [..]
      public function readXMLFiles() { [..]
                                 ^

      und beim Aufruf so?

      var foo:readXMLFile = new readXMLFile();  // ..File als Klasse
      foo.readXMLFiles();  // ..FileS als Methode
      trace(foo.XMLContent); // null :(

      Das ändert leider nichts am Ergebnis. Oder hab ich dich falsch verstanden?

      Grüße, Matze

      1. Hallo Matze,

        Das ändert leider nichts am Ergebnis. Oder hab ich dich falsch verstanden?

        Nein, das war schon das, was ich meinte. Hat aber wohl leider auch nichts gebracht.

        Grüße
        Richard

  2. Hallo,

    private function XMLloaded(e:Event):void {
                var XMLRes:XML = new XML(e.currentTarget.data);
                XMLRes.ignoreWhite = true;
                // nur Elementbaum mit "myElements"
                this.XMLContent = XMLRes.myElements;
                // gibt mir die XMLListe aus - das klappt hier
                trace(this.XMLContent);

    diese Funktion wird erst nach dem vollständigen Laden der XML-Datei aufgerufen

    var foo:readXMLFile = new readXMLFile();
    // hier bekomme ich null als Wert
    trace(foo.XMLContent);[/code]

    Dieses "trace" kommt zu schnell, die Funktion XMLloaded wurde noch nicht ausgeführt und foo.XMLContent ist demzufolge null.

    Was mich auch verwundert, ist die Reihenfolge der Ausgaben.
    Zuerst bekomme ich null vom zweiten trace() (also trace(foo.XMLContent), danach die gewünschte XML-Liste (von trace(this.XMLContent); in der Klasse).

    siehe oben

    Grüße Basti

    1. Hey Basti,

      Dieses "trace" kommt zu schnell, die Funktion XMLloaded wurde noch nicht ausgeführt und foo.XMLContent ist demzufolge null.

      recht herzlichen Dank! Das erklärt das Problem zumindest.
      Ich dachte der Compiler arbeitet erst die Klasse vollständig ab bevor er im Code fortfährt.

      Wie kann ich das jetzt ändern?

      Dank und Gruß, Matze

      1. Hallo,

        ich habe leider keine große Erfahrung mit OOP - Du könntest z.B. die nächste Aktion, welche nach dem Laden der XML-Datei durchgeführt werden soll, in der XMLoaded-Funktion auslösen.

        Grüße Basti

        1. Hallo,

          ich habe leider keine große Erfahrung mit OOP - Du könntest z.B. die nächste Aktion, welche nach dem Laden der XML-Datei durchgeführt werden soll, in der XMLoaded-Funktion auslösen.

          ich glaub mittlerweile auch, dass das die einzige Möglichkeit ist.
          Ich muss die muss die Elemente also "durchschleifen" :(

          Danke und Grüße, Matze

  3. Hallo!

    Ich habe das Problem jetzt gelöst. Fürs Archiv:

    Die Klasse muss um einen Event erweitert werden, der triggert wenn die XML vollständig geladen ist:

    private function XMLloaded(e:Event):void {  
        var XMLRes:XML = new XML(e.currentTarget.data);  
        XMLRes.ignoreWhite = true;  
        // nur Elementbaum mit "myElements"  
        this.XMLContent = XMLRes.myElements;  
        dispatchEvent(new Event(Event.COMPLETE)); // <- hier wird der Event gefeuert  
    }
    

    Der Aufruf der Klasse wird dann durch einen EventListener erweitert.

    var foo:readXMLFile = new readXMLFile();
    foo.addEventListener(Event.COMPLETE,xmlComplete); // <- warten bis XML geladen

    function xmlComplete(e:Event):void {  
        // funktioniert! :)  
        trace(foo.XMLContent);  
    }
    

    Ich hoffe es hilft noch jemand anderem, es hat mir den Kopf zerbrochen.

    Grüße, Matze