Zurück   Flashforum > Flash > ActionScript > ActionScript 1

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 06-03-2004, 13:21   #1 (permalink)
Flash User
 
Registriert seit: Nov 2002
Beiträge: 96
Question Einlesen einer XML-Datei

Hallo zusammen,

ich habe glaube ich ein grundsätzliches Problem mit dem Einlesen von XML-Dateien...

Das hier ist meine XML-Datei:
ActionScript:
  1. <xml>
  2.     <navigation config="navigation.xml" levels="4"/>
  3.     <stylesheet config="pageStyle1.css" />
  4. </xml>

Und mit diesem Code-Schnippsel aus ner Klassenmethode möchte ich darauf zugreifen:
ActionScript:
  1. _xmlConfig = new XML();
  2. _xmlConfig.ignoreWhite = true;
  3. _xmlConfig.load("config.xml");
  4. _xmlConfig.onLoad = function(ok)
  5. {
  6. if(ok)
  7. {
  8. trace("conf1 " + this.firstChild.firstChild.attributes['config']);
  9. //=> Ausgabe: conf1 navigation.xml  <-- also das, was ich will
  10.  
  11. trace("conf1b " + this.childNodes['xml'].childNodes['navigation'].attributes['config']);
  12. //=> Ausgabe: conf1b undefined
  13. }
  14. else
  15. {
  16. trace("Fehler beim Laden der Konfigurationsdatei config.xml.");
  17. }
  18. }
  19. trace("conf2 " + _xmlConfig.firstChild.firstChild.attributes['config']);
  20. //=> Ausgabe: conf2 undefined
  21.  

Wieso kann ich mit der 'trace conf2' anweisung nicht auf das Element zugreifen, obwohl ich den gleichen Pfad wie bei der 'trace conf1'-Anweisung habe?
Und wo liegt der Fehler bei der 'trace conf1b'-Zeile? childNodes[...] ist doch ein assoziatives Array und der Pfad stimmt doch mit dem zwei Zeilen darüber überein? Oder habe ich das mit dem Zugriff über das Array falsch verstanden? Eigentlich sollte dieser Weg doch der komfortabelste sein...
nickinicki ist offline   Mit Zitat antworten
Alt 06-03-2004, 17:43   #2 (permalink)
querdenker
 
Benutzerbild von kelor
 
Registriert seit: Jun 2001
Ort: formel1-stadt hockenheim
Beiträge: 4.731
deine letzte zeile ist vom pfad her korrekt, aber dürfte schlicht ein timing-problem haben...sprich: zu diesem zeitpunkt existiert der xml-inhalt noch nicht im objekt...

beim 2.ten schon mit ['XML'] probiert?...

habs mit aber auch net richtig angesehen...


greetz

kelor
kelor ist offline   Mit Zitat antworten
Alt 06-03-2004, 18:12   #3 (permalink)
Neuer User
 
Registriert seit: Mar 2002
Ort: D'dorf
Beiträge: 765
hi,

dass childNodes ein assoziatives Array ist, wäre mir neu.
Würde ja auch nicht wirklich Sinn machen, weil folgendes File schließlich auch ein gültiges XML-File ist:
PHP-Code:
<xml>
<
navigation config="navigation.xml" levels="4"/>
<
navigation config="navigation2.xml" levels="6"/>
<
navigation config="navigation3.xml" levels="5"/>
</
xml
Da käm man mit nem assoziativem Array nicht weit (welcher Knoten sollte mit childNodes['navigation'] angesprochen werden?).

Deshalb musst du bei childNodes mit Indizes arbeiten:
ActionScript:
  1. trace("conf1b " + this.childNodes[0].childNodes[1].attributes['config']);

Warum das mit conf2 nicht funzt hat kelor ja schon beantwortet:
der xml-Inhalt ist noch nicht geladen.

gruß,
roman
romän ist offline   Mit Zitat antworten
Alt 07-03-2004, 13:06   #4 (permalink)
Flash User
 
Registriert seit: Nov 2002
Beiträge: 96
Question

Danke erstmal :-)

@romän: Deine Erklärung hört sich einleuchzend ein. Den Ansatz mit dem assoziativen Array hatte ich von einfaches Beispiel für doofe??

@kelor: Das mit dem Timing-Problem dachte ich auch zuerst. Allerdings bekomme ich bei folgendem Code auch nicht das gewünschte Ergebnis:
ActionScript:
  1. _xmlConfig = new XML();
  2. _xmlConfig.ignoreWhite = true;
  3. _xmlConfig.load("config.xml");
  4. _xmlConfig.onLoad = function(ok)
  5. {
  6. if(ok)
  7. {
  8. trace("Konfigurationsdatei config.xml geladen.");
  9. trace("conf1 " + this.firstChild.firstChild.attributes['config']);
  10. trace("conf2 " + _xmlConfig.firstChild.firstChild.attributes['config']);
  11. }
  12. else
  13. {
  14. trace("Fehler beim Laden der Konfigurationsdatei config.xml.");
  15. }
  16. }

Als Ausgabe bekomme ich weiterhin:
ActionScript:
  1. conf1 navigation.xml
  2. conf2 undefined

Bin etwas ratlos....

Gruß,
Nicki
nickinicki ist offline   Mit Zitat antworten
Alt 07-03-2004, 13:20   #5 (permalink)
Neuer User
 
Registriert seit: Dec 2001
Ort: D
Beiträge: 381
nich ratlos sein, ist nur Flüchtigkeitsfehler:

nich so:
ActionScript:
  1. trace("Konfigurationsdatei config.xml geladen.");
  2.                 trace("conf1 " + this.firstChild.firstChild.attributes['config']);
  3.                 trace("conf2 " + _xmlConfig.firstChild.firstChild.attributes['config']);
sondern so:
ActionScript:
  1. trace("Konfigurationsdatei config.xml geladen.");
  2.                 trace("conf1 " + this.firstChild.firstChild.attributes['config']);
  3.                 trace("conf2 " + this.firstChild.firstChild.attributes['config']);
momo-loom ist offline   Mit Zitat antworten
Alt 07-03-2004, 13:43   #6 (permalink)
querdenker
 
Benutzerbild von kelor
 
Registriert seit: Jun 2001
Ort: formel1-stadt hockenheim
Beiträge: 4.731
die zweite variante ist ja nicht nötig...da innerhalb des objektes ein 'this' ja das objekt selbst repräsentiert...aber das ist ja eh klar...

allerdings staune ich auch, denn ich bekomme bei mir korrekte ergebnisse getraced, wenn ich es versuche nachzubauen...

also bei mir liefert innerhalb einer xml-funktion ein:
ActionScript:
  1. var attribute_str = myXML.childNodes[0].childNodes[0].attribute['filetype'];
  2. trace(attribute_str);

den korrekten inhalt/string zurück...



ich habe immo selbst keine ahnung, wo da der fehler liegen sollte...oder bin ich blind geworden???!! *augenreib*such*

greetz

kelor
kelor ist offline   Mit Zitat antworten
Alt 07-03-2004, 13:45   #7 (permalink)
querdenker
 
Benutzerbild von kelor
 
Registriert seit: Jun 2001
Ort: formel1-stadt hockenheim
Beiträge: 4.731
momo-loom ...

HÄ ???

versteh ich den witz nicht?...*koppkratz*


greetz

kelor
kelor ist offline   Mit Zitat antworten
Alt 09-03-2004, 14:34   #8 (permalink)
Flash User
 
Registriert seit: Nov 2002
Beiträge: 96
Hallo nochmal,

ich habe wieder weiter getestet: der obige Code-Schnippsel funktioniert alleine in einem Frame tatsächlich (bis auf das Problem der Reihenfolge versteht sich...).
In einer Klassenmethode allerdings nicht mehr.
Ich poste einfach mal zwei Versionen mit dem Code, als Kommentar hinter den trace-Zeilen das jeweilige Ergebnis:

ActionScript:
  1. class AppConfig
  2. {
  3.  
  4.  function AppConfig()
  5.  {
  6.   //config.xml laden
  7.   var _xmlConfig:XML = new XML();
  8.   _xmlConfig.ignoreWhite = true;
  9.   _xmlConfig.load("config.xml");
  10.   _xmlConfig.onLoad = function(ok)
  11.   {
  12.    if(ok)
  13.    {
  14.     trace("Konfigurationsdatei config.xml geladen.");
  15.     trace("conf1 " + this.firstChild.firstChild.attributes['config']);   //ok
  16.     trace("conf1b " + this.childNodes[0].childNodes[0].attributes['config'])//ok
  17.     trace("conf2 " + _xmlConfig.firstChild.firstChild.attributes['config'])//ok
  18.    }
  19.    else
  20.    {
  21.     trace("Fehler beim Laden der Konfigurationsdatei config.xml.");
  22.    }
  23.   }
  24.   trace("conf2b " + _xmlConfig.firstChild)//null -> xml nicht fertig geladen
  25.  }
  26. }
  27.  
  28.  
  29.  
  30.  
  31. class AppConfig
  32. {
  33.  private var _xmlConfig:XML;
  34.  
  35.  function AppConfig()
  36.  {
  37.   //config.xml laden
  38.   _xmlConfig = new XML();
  39.   _xmlConfig.ignoreWhite = true;
  40.   _xmlConfig.load("config.xml");
  41.   _xmlConfig.onLoad = function(ok)
  42.   {
  43.    if(ok)
  44.    {
  45.     trace("Konfigurationsdatei config.xml geladen.");
  46.     trace("conf1 " + this.firstChild.firstChild.attributes['config']);   //ok
  47.     trace("conf1b " + this.childNodes[0].childNodes[0].attributes['config'])//ok
  48.     trace("conf2 " + _xmlConfig.firstChild.firstChild.attributes['config'])//undefined
  49.    }
  50.    else
  51.    {
  52.     trace("Fehler beim Laden der Konfigurationsdatei config.xml.");
  53.    }
  54.   }
  55.   trace("conf2b " + _xmlConfig.firstChild)//null -> xml nicht fertig geladen
  56.  }
  57. }

Ist das mit der onLoad-Funktion innerhalb der Konstruktormethode stilistisch eigentlich überhaupt sauber?

Und weshalb kann ich von dieser Funktion aus nicht mehr auf meine Klasseneigenschaftsvariable zugreifen?


Danke schonmal vorab...

Gruß
Nicki :-)
nickinicki ist offline   Mit Zitat antworten
Alt 09-03-2004, 15:26   #9 (permalink)
Flashaholic
 
Benutzerbild von atothek
 
Registriert seit: Feb 2003
Ort: Berlin
Beiträge: 1.459
kann es vielleicht sein das du inerhalb der onLoad Methode auf eine neue Eigenschaft verweist

und zwar ist
ActionScript:
  1. trace("Konfigurationsdatei config.xml geladen.");
  2.                                 trace("conf1 " + this.firstChild.firstChild.attributes['config']);   //ok
  3.                                 trace("conf1b " + this.childNodes[0].childNodes[0].attributes['config'])//ok
  4.                                 trace("conf2 " + _xmlConfig.firstChild.firstChild.attributes['config'])//undefined
  5.  

conf2 undefined weil es als neue Eigenschaft des _xmlConfig verstanden wird also
_xmlConfig._xmlConfig

das conf2b nicht geht ist klar.
__________________
TVNEXT Solutions
atothek ist offline   Mit Zitat antworten
Alt 09-03-2004, 16:28   #10 (permalink)
Flash User
 
Registriert seit: Nov 2002
Beiträge: 96
Hallo atothek,

jo, ich denke auch, dass es daran liegt, dass ich nicht die richtige Eigenschaft anspreche. Aber wie komme ich in dem oben geposteten Code an meine Klasseneigenschaft?

Auch bei folgendem Versuch sehe ich im Debugger ein Objekt _xmlConfig mit der Eigenschaft _sTest, obwohl ich natürlich eigentlich die Eigenschaft meiner Klasse AppConfig ansprechen wollte... Die trace-Anweisungen ergeben erwartungsgemäß wieder undefined

ActionScript:
  1. class AppConfig
  2. {
  3.  private var _xmlConfig:XML;
  4.  private var _sTest:String;
  5.  
  6.  function AppConfig()
  7.  {
  8.   _xmlConfig = new XML();
  9.   _xmlConfig.ignoreWhite = true;
  10.   _xmlConfig.load("config.xml");
  11.   _xmlConfig.onLoad = loadConfig;
  12.  }
  13.  
  14.  public function loadConfig()
  15.  {
  16.   trace("conf1 " + _xmlConfig.firstChild.firstChild.attributes['config'])
  17.   trace("conf1b " + _xmlConfig.childNodes[0].childNodes[0].attributes['config']);
  18. _sTest = _xmlConfig.childNodes[0].childNodes[0].attributes['config'];
  19.  }
  20. }
nickinicki ist offline   Mit Zitat antworten
Alt 09-03-2004, 18:10   #11 (permalink)
Flashaholic
 
Benutzerbild von atothek
 
Registriert seit: Feb 2003
Ort: Berlin
Beiträge: 1.459
Hier ein kleiner unschöner Workaround
mit setInterval. Anscheinend verhält es sich beim onLoad Event ähnlich wie bei MC´s doch bei denen kann man mit _parent wieder rauskommen.
ActionScript:
  1. class test extends XML {
  2.     //
  3.     private var _xmlConfig:XML;
  4.     private var _sTest:String;
  5.     private var intval;
  6.     //
  7.     function test() {
  8.         this.loadXML();
  9.         _global.flag = false;
  10.         this.intval = setInterval(this, "loadConfig", 100);
  11.     }
  12.     private function loadXML():Void {
  13.         this._xmlConfig = new XML();
  14.         this._xmlConfig.ignoreWhite = true;
  15.         this._xmlConfig.load("config.xml");
  16.         this._xmlConfig.onLoad = function(status) {
  17.             if (status) {
  18.                 _global.flag = true;
  19.             }
  20.         };
  21.     }
  22.     function loadConfig() {
  23.         if (_global.flag) {
  24.             trace("conf1 "+_xmlConfig.firstChild.firstChild.attributes['config']);
  25.             trace("conf1b "+_global.bla._xmlConfig.childNodes[0].childNodes[0].attributes['config']);
  26.             _sTest = _xmlConfig.childNodes[0].childNodes[0].attributes['config'];
  27.             delete _global.flag;
  28.             clearInterval(this.intval);
  29.         }
  30.     }
  31. }
__________________
TVNEXT Solutions
atothek ist offline   Mit Zitat antworten
Alt 09-03-2004, 19:20   #12 (permalink)
Flash User
 
Registriert seit: Nov 2002
Beiträge: 96
Hallo atothek :-)

Danke, der Workaround funktioniert :-))

Allerdings: ist das tatsächlich die einzige Möglichkeit in ActionScript 2.0, aus nem XML.onLoad auf Eigenschaften der umgebenden Klasse zuzugreifen?
Kann doch nicht sein, oder?

Gruß
Nicki
nickinicki ist offline   Mit Zitat antworten
Alt 09-03-2004, 19:31   #13 (permalink)
Flashaholic
 
Benutzerbild von atothek
 
Registriert seit: Feb 2003
Ort: Berlin
Beiträge: 1.459
Kann an sich auch nicht sein bin aber kein as2 profi. aber das onLoad Event war schon immer ein wenig komisch, für meinen geschmack.

der Workaround ist sicherlich auch nicht das wahre aber wenn der weg nach rom führt ist es erstmal ok

sowiéit viel spaß bis die tage
__________________
TVNEXT Solutions
atothek ist offline   Mit Zitat antworten
Alt 10-03-2004, 09:14   #14 (permalink)
Flash User
 
Registriert seit: Nov 2002
Beiträge: 96
Trotzdem nochmal ein großes Danke an dich! :-)

Vielleicht schreibt ja noch wer was dazu. Wenn ich noch was rausbekomme, poste ichs natürlich auch...

Nicki :-)
nickinicki ist offline   Mit Zitat antworten
Alt 10-03-2004, 09:39   #15 (permalink)
Neuer User
 
Registriert seit: Dec 2001
Ort: D
Beiträge: 381
weiss nicht, ob's daran liegen könnte, aber das "onLoad" muss vor dem "load"
kommen.
momo-loom 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 10:41 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele