Raoul: Probleme XML und Flash

Kann mir jemand bitte einen Tipp geben, am besten sogar ein Codebeispiel, wie ich via Flash Daten an ein PHP-Script sende und mir anschließend den generierten XML runterladen und auch anzeigen kann. Nach 100 Versuchen ist mein Skript immerweiter geschrumpft bis letztendlich nurnoch folgendes stehen blieb, was aber auch nicht funktioniert.

stop();
xml = new XML();
xml.load("chat/test.xml");
history.text= xml.toString();

history ist in diesem Fall ein dynamsches Textfeld. Zuweisungen wie:

history.text = "blabla";

funktionieren einwandfrei.

meine swf-Datei liegt in root/chat, ist allerdings in eine html-Datei eingebunden, welche in root liegt. text.xml ist eine drei-zeilige XML-Datei nur um das Skript zu testen. Ich weiß, dass man Variablen mit LoadVars() überträgt, aber wenn nichteinmal dieser kleine Teil meines Skripts funktioniert...

Vielen Dank.

  1. Hallo Raoul!

    Kann mir jemand bitte einen Tipp geben, am besten sogar ein Codebeispiel,
    stop();
    xml = new XML();
    xml.load("chat/test.xml");
    history.text= xml.toString();

    Um ein XML-Dokument zu lesen müste der Code etwa so aussehen:

    var XMLObj = new XML();      // erzeugt ein neues XML-Objekt
    XMLObj.onLoad = geladen;     // stellt fest, ob das Objekt geladen ist
    XMLObj.ignoreWhite = true;   // verhindert, dass Whitespace als Knoten interpretiert wird
    XMLObj.load("dokument.xml"); // lädt das XML-Dokument

    function geladen(erfolgreich) {
      if(erfolgreich) {
        play();
      }
      else {
        gotoAndStop("Fehler");
      }
    }

    meine swf-Datei liegt in root/chat, ist allerdings in eine html-Datei eingebunden, welche in root liegt. text.xml ist eine drei-zeilige XML-Datei nur um das Skript zu testen. Ich weiß, dass man Variablen mit LoadVars() überträgt, aber wenn nichteinmal dieser kleine Teil meines Skripts funktioniert...

    Könntest du das etwas geordneter beschreiben?

    Beste Grüsse
    Richard

    1. Hallo Richard,

      var XMLObj = new XML();      // erzeugt ein neues XML-Objekt
      XMLObj.onLoad = geladen;     // stellt fest, ob das Objekt geladen ist
      XMLObj.ignoreWhite = true;   // verhindert, dass Whitespace als Knoten interpretiert wird
      XMLObj.load("dokument.xml"); // lädt das XML-Dokument

      Ich lade meine XML-Datei ja mit der selben Methode, aber toString() liefert mir ja trotzdem nur einen leeren String, woraus ich schließe, dass es Fehler beim laden gibt. Die XML-Datei ist bloß zu Testzwecken erstellt und enthält 100%ig keine Syntax fehler.

      Könntest du das etwas geordneter beschreiben?

      Mein Verzeichnisbaum sieht wie folgt aus:

      root (Hauptverzeichnis)
      -- client.php (Hier ist meine swf-Datei eingebunden)
      -- chat (Ordner)
      ---- client.swf
      ---- test.xml (Soll geladen werden)

      Vielen Dank für deine Antwort.

      mfG

      Raoul

      1. Hallo Raoul!

        Ich lade meine XML-Datei ja mit der selben Methode,

        Die Frage ist: Wohin denn? Geladen würde diese in das XMLObj, das du mit deinem Code aber nicht erstellst.

        aber toString() liefert mir ja trotzdem nur einen leeren String,

        Was willst du denn mit der Methode XML.toString an dieser Stelle erreichen? Damit wandelst du einen Knoten mit samt seinen Kindern in XML-Text um.

        woraus ich schließe, dass es Fehler beim laden gibt.

        Muss es ja auch. Ob und was geladen wird, kannst du dir ja mit trace anzeigen lassen.

        Mein Verzeichnisbaum sieht wie folgt aus:

        root (Hauptverzeichnis)
        -- client.php (Hier ist meine swf-Datei eingebunden)

        Soweit ist dies eine andere Baustelle. Entscheiden ist, welche SWF-Datei du auf dem Client ansprichst, da gibt es kein PHP mehr.

        -- chat (Ordner)
        ---- client.swf
        ---- test.xml (Soll geladen werden)

        Wenn du die client.swf ansprichst, liegt nach deiner Darstellung die test.xml im gleichen Verzeichnis, würde also mit XMLObj.load("test.xml"); angesprochen.

        Beste Grüsse
        Richard

        1. Vielen Dank nochmal, aber bei gibt es leider immernoch Probleme.

          Die Frage ist: Wohin denn? Geladen würde diese in das XMLObj, das du mit deinem Code aber nicht erstellst.

          Ich habe den Constructor doch auch aufgerufen:

          xml = new XML (); // oder ist hieran etwas falsch?

          Was willst du denn mit der Methode XML.toString an dieser Stelle erreichen? Damit wandelst du einen Knoten mit samt seinen Kindern in XML-Text um.

          Das hatte ich auch vor. Weil bei mir alle Ausgabeversuche kläglich gescheitert sind, wollte ich nur Probeweise testen, ob überhaupt etwas in meine XML-Instanz geladen wurde.

          Muss es ja auch. Ob und was geladen wird, kannst du dir ja mit trace anzeigen lassen.

          Ob ich mir nun die Strings in ein dynamisches Textfeld lade, oder sie mit trace ausgebe ist doch egal oder? Jedenfalls liefert die Methode toString() mir bei jedem Aufruf nur ein "Undefined" zurück.

          Soweit ist dies eine andere Baustelle. Entscheiden ist, welche SWF-Datei du auf dem Client ansprichst, da gibt es kein PHP mehr.

          Wenn du die client.swf ansprichst, liegt nach deiner Darstellung die test.xml im gleichen Verzeichnis, würde also mit XMLObj.load("test.xml"); angesprochen.

          Von der Methode loadMovie() kenn ich es so, dass der Pfad relativ von dem Verzeichnis angegeben werden muss, in dem die Datei liegt, in welcher die SWF-Datei eingebunde ist, nicht vom Verzeichnis aus, in dem die SWF-Datei abgelegt ist, ist das bei XML anders?

          Vielen Dank für deine Geduld mit mir.

          1. Hallo Raoul!

            Ich habe den Constructor doch auch aufgerufen:
            xml = new XML (); // oder ist hieran etwas falsch?

            Du darfst die hier erzeugte Variable nicht xml nennen, dies führt zum Konflikt mit der Methode XML.toString(); und hat auch mich in die Irre geleitet. Eindeutiger wäre z.B.: var XMLObj = new XML();

            Dann fehlt in deinem Code irgendwie eine Variable in die der Text aus der XML-Datei geladen werden kann und die mit dem dynamischen Textfeld in Verbindung steht. Also etwas wie:
            xmlText = XMLObj.toString();
            Dies ist so allerdings nur in deiner Testumgebung wirklich sinnvoll. Wenn du später die Inhalte der XML_Datei mit einer for-Schleife ausliest, werden die einzelnen Knoten in ein Array gespeichert. Dann ist auch toString(); nicht mehr erforderlich.

            Ob ich mir nun die Strings in ein dynamisches Textfeld lade, oder sie mit trace ausgebe ist doch egal oder?

            Nur mit trace könntest du das bereits für das das XML-Objekt und nicht erst für das Textfeld feststellen.

            Jedenfalls liefert die Methode toString() mir bei jedem Aufruf nur ein "Undefined" zurück.

            Dies liegt an deiner XML-Datei, genauer an deren fehlender Deklaration. In deinem Fall beruht dies aber darauf, dass deine Variable xml heisst und Flash deshalb die Methode XML.toString(); anwendet (diese greift nicht auf den Inhalt der XML-Datei zu, sondern auf die XML-Datei selbst), statt den Inhalt deiner XML-Datei in einen String zu wandeln, also variable.toString(); auszuführen.

            Von der Methode loadMovie() kenn ich es so, dass der Pfad relativ von dem Verzeichnis angegeben werden muss, in dem die Datei liegt, in welcher die SWF-Datei eingebunde ist, nicht vom Verzeichnis aus, in dem die SWF-Datei abgelegt ist, ist das bei XML anders?

            Eigentlich nicht. Die HTML-Seite ist zustandslos, die weiss weder wer sie ist, noch woher sie kommt. Flash dagegen weiss dies, kennt also den Pfad zur SWF-Datei. Aber bei loadMovie() wird ja ein MovieClip in einen anderen MovieClip geladen und der Pfad meist auf _root zurückgeführt. Du kannst ja zum Testen den Pfad absolut angeben, dann bist du sicher, dass er richtig ist.

            Vielen Dank für deine Geduld mit mir.

            Ist schon gut! :-) Das Thema interessiert mich ja selber auch und ich habe dabei auch ein paar neue Dinge gelernt.

            Beste Grüsse
            Richard