Zurück   Flashforum > Flash > ActionScript > ActionScript 1

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 12-11-2003, 09:28   #1 (permalink)
.--. .. ..- ...
 
Benutzerbild von pius
 
Registriert seit: Jul 2002
Ort: munich
Beiträge: 1.345
Post xml nach array parsen - ganz easy STUFF

Ausgangsstellung:

Ihr braucht in Eurer Flash-Applikation eine ganze Menge strukturierter Daten, die ihr am Liebsten von Extern reinladen würdet ...
Inzwischen habt Ihr es mit dem LoadVars probiert, doch das Verarbeiten der Variablen war Euch zu mühselig ...
An XML habt Ihr Euch nicht so richtig 'drangetraut' ...
auch wenn's genau die Lösung wäre.

Ein Lösungsansatz:

Ihr kopiert dieses Script

ActionScript:
  1. //----------------------------------------------------------------------------
  2. //  xml2tree
  3. //  --- --- --- --- ---
  4. //  authors:  Maier Bernhard (pius) | Andrea Stubbe (Astrosusi)
  5. //  version:  20031112  'supershort'
  6. //----------------------------------------------------------------------------
  7. Object.prototype.__xml2tree = function(f, tN) {
  8.     var d = new Object();
  9.     d.__p = function(n) {
  10.         var t = new Object();
  11.         for (var a in n.attributes) {
  12.             t[a] = n.attributes[a];
  13.         }
  14.         for (var c = 0; c<n.childNodes.length; c++) {
  15.             if (t[n.childNodes[c].nodeName] == undefined) {
  16.                 t[n.childNodes[c].nodeName] = new Array();
  17.             }
  18.             t[n.childNodes[c].nodeName].push(this.__p(n.childNodes[c]));
  19.         }
  20.         return t;
  21.     };
  22.     d.__l = function(s) {
  23.         trace('xml2tree: loaded xml-File: '+f+'\t('+s+')');
  24.         if (s) {
  25.             trace('xml2tree: parsing xml to: _global.'+tN);
  26.             _global[tN] = d.__p(d.xml);
  27.             trace('xml2tree: ready');
  28.         } else {
  29.             trace('!!! xml2tree: error !!!');
  30.         }
  31.     };
  32.     d.xml = new XML();
  33.     d.xml.ignoreWhite = true;
  34.     d.xml.onLoad = d.__l;
  35.     d.xml.load(f);
  36. };
  37. //----------------------------------------------------------------------------
  38.  
  39.  
  40. // Aufrufen: XML-File, Baum-Bezeichenr
  41. __xml2tree('flashforum.xml', 'flashforum');

in die Hauptzeitleiste.

Dann braucht Ihr noch eine XML-Datei ('oh jeh') ... nein, ist ganz einfach:

Hierzu kopiert Ihr z.B. folgendes in ein ganz normales, leeres Textfile:

PHP-Code:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE tbn SYSTEM "tbn.dtd">


<forum name="flashforum" url="http://www.flashforum.de" autorVN="Sascha" autorNN="Wolter" creationDate="20031111">

    <bereich name="Aktuelles" url="http://www.flashforum.de/forum/forumdisplay.php?s=&forumid=24">
    
        <subBereich name="Nachrichten" url="http://www.flashforum.de/forum/forumdisplay.php?s=&forumid=20" />
        <subBereich name="Seminare" url="http://www.flashforum.de/forum/forumdisplay.php?s=&forumid=56" />
        <subBereich name="Bücher" url="http://www.flashforum.de/forum/forumdisplay.php?s=&forumid=21" />
        <subBereich name="Konferenzen und Treffen" url="http://www.flashforum.de/forum/forumdisplay.php?s=&forumid=46" />
        <subBereich name="Awards und Wettbewerbe" url="http://www.flashforum.de/forum/forumdisplay.php?s=&forumid=47" />
        <subBereich name="Vergünstigungen" url="http://www.flashforum.de/forum/forumdisplay.php?s=&forumid=52" />
        <subBereich name="Tutorials und FAQs" url="http://www.flashforum.de/forum/forumdisplay.php?s=&forumid=25" />
        <subBereich name="Jobs und Projekte" url="http://www.flashforum.de/forum/forumdisplay.php?s=&forumid=15" />

    </bereich>


    <bereich name="Gestaltung und Programmierung" url="http://www.flashforum.de/forum/forumdisplay.php?s=&forumid=8">
        <subBereich name="Gestaltung" url="http://www.flashforum.de/forum/forumdisplay.php?s=&forumid=3" />
        <subBereich name="3D und Video" url="http://www.flashforum.de/forum/forumdisplay.php?s=&forumid=68" />
        <subBereich name="HTML" url="http://www.flashforum.de/forum/forumdisplay.php?s=&forumid=16" />
        <subBereich name="PHP und MySQL" url="http://www.flashforum.de/forum/forumdisplay.php?s=&forumid=65" />
        <subBereich name="Tools" url="http://www.flashforum.de/forum/forumdisplay.php?s=&forumid=17" />
        <subBereich name="Director" url="http://www.flashforum.de/forum/forumdisplay.php?s=&forumid=66" />
        <subBereich name="Sitecheck" url="http://www.flashforum.de/forum/forumdisplay.php?s=&forumid=12" />
        <subBereich name="Coolsites" url="http://www.flashforum.de/forum/forumdisplay.php?s=&forumid=13" />
    </bereich>

        
    <bereich name="Flash" url="http://www.flashforum.de/forum/forumdisplay.php?s=&forumid=5">
        <subBereich name="Allgemeines rund um Flash" url="http://www.flashforum.de/forum/forumdisplay.php?s=&forumid=11" />
        <subBereich name="Flash 4 und 5" url="http://www.flashforum.de/forum/forumdisplay.php?s=&forumid=4" />
        <subBereich name="Flash MX" url="http://www.flashforum.de/forum/forumdisplay.php?s=&forumid=33" />
        <subBereich name="Flash MX 2004 und Flash MX Professional 2004" url="http://www.flashforum.de/forum/forumdisplay.php?s=&forumid=70" />
        <subBereich name="ActionScript" url="http://www.flashforum.de/forum/forumdisplay.php?s=&forumid=73" />
        <subBereich name="ActionScript 2.0" url="http://www.flashforum.de/forum/forumdisplay.php?s=&forumid=71" />
        <subBereich name="Komponenten und SmartClips" url="http://www.flashforum.de/forum/forumdisplay.php?s=&forumid=36" />
        <subBereich name="OOP" url="http://www.flashforum.de/forum/forumdisplay.php?s=&forumid=10" />
        <subBereich name="Flash serverseitig" url="http://www.flashforum.de/forum/forumdisplay.php?s=&forumid=64" />
        <subBereich name="JavaScript API" url="http://www.flashforum.de/forum/forumdisplay.php?s=&forumid=72" />
    </bereich>

    <bereich name="Ohne Thema" url="http://www.flashforum.de/forum/forumdisplay.php?s=&forumid=14">
        <subBereich name="Am Rande" url="http://www.flashforum.de/forum/forumdisplay.php?s=&forumid=53" />
        <subBereich name="Gespräche" url="http://www.flashforum.de/forum/forumdisplay.php?s=&forumid=18" />
        <subBereich name="Fragen, Konstruktive Kritik, Lob" url="http://www.flashforum.de/forum/forumdisplay.php?s=&forumid=19" />
    </bereich>

</forum>

und speichert es als reinen Text im UTF-8 Format ab.
Hier den Dateinamen: 'flashforum.xml' verwenden.
Hierbei aufpassen, dass die Datei wirklich nur die Extension '.xml' hat und nicht etwa mit '.xml.txt' endet !

Wenn Euer .swf und das .xml in einem Ordner liegen, dann braucht Ihr in Eurer 'Flash-Entwicklungsumgebung' nur mal die Tasten:
[strg]+[shift]+[enter]
drücken ...
den grünen Pfeil im Debugger klicken...
einen kurzen Augenblick warten ...
und Euch dann die Variablen in '_global' ansehen ...


Was passiert da?

Die XML-Nodes werden in einem Array gesammelt, das den Nodenamen als Bezeichner trägt. Nodeattribute werden als Eigenschaften den entsprechenden Arrayelementen zugeordnet.
Das ganze geschieht rekursiv über alle Childnodes.


Was ist zu beachten?

Die Schachtelungstiefe der Childnodes darf nicht die 'Flash-Rekursionsgrenze' übersteigen.
Als Nodenamen nur xml-konforme Namen vergeben.
Ein Attribut dessen Bezeichner mit einem der Childnodenamen übereinstimmt wird überschrieben.


Und was soll ich damit?

Ich denke aus dem Beispiel lässt sich der Verwendungszweck erkennen. Die XML-Struktur könnt ihr einfach an Eure Bedürfnisse anpassen und mit Euren Daten füllen ('dat müt Ihr selba machen ...'




- please report bugs -


viel Spass damit
pius
__________________
one out of many

Geändert von pius (12-11-2003 um 10:29 Uhr)
pius ist offline   Mit Zitat antworten
Alt 12-11-2003, 10:08   #2 (permalink)
HAY
Neuer User
 
Benutzerbild von HAY
 
Registriert seit: Aug 2002
Ort: Faust-Stadt
Beiträge: 2.577
hi prima sache das ganze und so schön schnuklig klein der code.
im thread-namen sollte noch ein STUFF stehen.
__________________
gruß Harry
HAY ist offline   Mit Zitat antworten
Alt 12-11-2003, 10:12   #3 (permalink)
Neuer User
 
Registriert seit: Apr 2002
Beiträge: 129
textknoten??

Hi Pius,
klasse sache!
Nur was mach ich mit meinen Textknoten? Die ergeben bei mir null mit nem leeren wert.
mein xml beispiel:
<COMMENT id="12" type="letter">mein textinhalt</COMMENT>

die attribute werden schön gelesen, "mein textinhalt" ergibt leider null.

Hab grad erst angefangen,mich mit xml auseinander zusetzen...

Gruß Jackie
jackie_o ist offline   Mit Zitat antworten
Alt 12-11-2003, 10:24   #4 (permalink)
HAY
Neuer User
 
Benutzerbild von HAY
 
Registriert seit: Aug 2002
Ort: Faust-Stadt
Beiträge: 2.577
hi @jackie_o
<COMMENT id="12" type="letter" text="mein textinhalt"></COMMENT>
__________________
gruß Harry
HAY ist offline   Mit Zitat antworten
Alt 12-11-2003, 10:27   #5 (permalink)
.--. .. ..- ...
 
Benutzerbild von pius
 
Registriert seit: Jul 2002
Ort: munich
Beiträge: 1.345
oder kürzer:

<COMMENT id="12" type="letter" text="mein textinhalt" />
__________________
one out of many
pius ist offline   Mit Zitat antworten
Alt 12-11-2003, 10:41   #6 (permalink)
Neuer User
 
Registriert seit: Apr 2002
Beiträge: 129
HI,
das war mir schon klar

nur leider kann und tut es vorkommen, das mir jemand ein xml liefert, das eben so wie mein beispiel strukturiert ist.

Bisher hab ich die xml sozusagen per hand umgewandelt, aber so ein skript ist natürlich viel komfortabler.

Also wenn ich noch ne idee habt, wär das super.

jackie
jackie_o ist offline   Mit Zitat antworten
Alt 12-11-2003, 13:32   #7 (permalink)
.--. .. ..- ...
 
Benutzerbild von pius
 
Registriert seit: Jul 2002
Ort: munich
Beiträge: 1.345
hier nun mit der Möglichkeit in Endknoten auch Texte, also 'nodeValues' anzugeben ....


ActionScript:
  1. //----------------------------------------------------------------------------
  2. //  xml2tree
  3. //  --- --- --- --- ---
  4. //  authors:  Maier Bernhard (pius) | Andrea Stubbe (Astrosusi)
  5. //  version:  20031112  'supershort mit nodeValue'
  6. //----------------------------------------------------------------------------
  7. Object.prototype.__xml2tree = function(f, tN) {
  8.     var d = new Object();
  9.     d.__p = function(n) {
  10.         var t = new Object();
  11.         for (var a in n.attributes) {
  12.             t[a] = n.attributes[a];
  13.         }
  14.         for (var c = 0; c<n.childNodes.length; c++) {
  15.             if(n.childNodes[c].nodeName != null){
  16.                 if (t[n.childNodes[c].nodeName] == undefined) {
  17.                     t[n.childNodes[c].nodeName] = new Array();
  18.                 }
  19.                 t[n.childNodes[c].nodeName].push(this.__p(n.childNodes[c]));
  20.             }else{
  21.                 if(n.childNodes[c].nodeValue!=null && n.childNodes[c].nodeValue!=""){
  22.                         t[n.nodeName+"_pcdata"] = n.childNodes[c].nodeValue;
  23.                 }
  24.             }
  25.         }
  26.     return t;
  27.     };
  28.     d.__l = function(s) {
  29.         trace('xml2tree: loaded xml-File: '+f+'\t('+s+')');
  30.         if (s) {
  31.             trace('xml2tree: parsing xml to: _global.'+tN);
  32.             _global[tN] = d.__p(d.xml);
  33.             trace('xml2tree: ready');
  34.         } else {
  35.             trace('!!! xml2tree: error !!!');
  36.         }
  37.     };
  38.     d.xml = new XML();
  39.     d.xml.ignoreWhite = true;
  40.     d.xml.onLoad = d.__l;
  41.     d.xml.load(f);
  42. };
  43. //----------------------------------------------------------------------------
  44.  
  45.  
  46. // Aufrufen: XML-File, Baum-Bezeichenr
  47. __xml2tree('flashforum.xml', 'flashforum');
__________________
one out of many
pius ist offline   Mit Zitat antworten
Alt 12-11-2003, 16:22   #8 (permalink)
Neuer User
 
Registriert seit: Apr 2002
Beiträge: 129
cool!

leider bin ich jedoch noch nicht über die variablen anzeige im debugger hinaus gekommen...

du schreibst ja, das das xml in ein array (oder mehrere??) gepackt wird, aber wie heißt das? wie kann ich das ansprechen , mit den variablennamen? und ist das dann ein merhfach verschachteltes array? 100 Fragen
Vielleicht hast du ja noch mal lust, was dazu zu schreiben.

Bis denn, viele grüße
jackie
jackie_o ist offline   Mit Zitat antworten
Alt 12-11-2003, 16:37   #9 (permalink)
.--. .. ..- ...
 
Benutzerbild von pius
 
Registriert seit: Jul 2002
Ort: munich
Beiträge: 1.345
na, in '_global' hast du's doch gesehen ... oder?

wie das teil heissen soll, gibst du doch beim funktionsaufruf mit ...!

und ansprechen kannst du's dann über die Pfade wie sie im Debugger ersichtlich werden ...

also wenn du's mit dem ersten beispiel machst:


ActionScript:
  1. __xml2tree('flashforum.xml', 'flashforum');


dann wird der baum als: '_global.flashforum' angelegt.

der erste node im xml heisst 'forum', den findest du unter:

_global.flashforum.forum[0]

damit also z.B. das Attribut 'name' unter:

_global.flashforum.forum[0].name


die bereiche sind gesammelt in einem Array das 'bereich' (wie der node selber ...) heisst, also:

_global.flashforum.forum[0].bereich

dort kommst du an die url über:

_global.flashforum.forum[0].bereich[0].url



die subbereiche sind wieder in einem array gesammelt, das ... na aber jetzt dürfte es klar sein ....

nur noch folgendes:

der endnode mit text:

der text wird als Eigenschaft abgelegt, die mit

<nodename>+'_pcdata' bezeichnet wird ...


... aber das findest du auch im debugger ...


__________________
one out of many
pius ist offline   Mit Zitat antworten
Alt 12-11-2003, 17:26   #10 (permalink)
Neuer User
 
Registriert seit: Apr 2002
Beiträge: 129
hi pius,

danke für deine antwort!
jetzt funktioniertsauch mit dem tracen,
hab wahrscheinlich zu früh aufgehört mit dem pfad (hat dann nur object object ausgegeben...)

was ich auch beobachtet hab, das man das erst ein paar frames später ausgeben/tracen kann, sonst gibts undefined
das parsen brauch wohl einige zeit

und noch eins zum grundsätzlichen verständnis:
die struktur bleibt gleich, sieht nur weniger abstrakt aus, weil konkreter name statt childnode. Ist das der zweck des scripts?Oder ist mir da noch was entgangen.

Sorry für die blöden Fragen, hoffe, dich nicht zu sehr zu nerven..

Jackie
jackie_o ist offline   Mit Zitat antworten
Alt 12-11-2003, 17:32   #11 (permalink)
.--. .. ..- ...
 
Benutzerbild von pius
 
Registriert seit: Jul 2002
Ort: munich
Beiträge: 1.345
ja, nicht nur das parsen dauert, sondern die XML-Datei muss ja erst mal geladen werden ...


nun, die struktur ... naja, es ändert sich schon ein wenig was ... z.B. sind die Attribute einfach Eigenschaften geworden ... usw.

aber richtig, im wesentlichen soll die Struktur aus dem XML übernommen werden, aber eben etwas handlicher ansprechbar als mit:

xml.firstChild.childNodes[i].childNodes[j].childNodes[k].attributes['name'].value ... oder so ...





.. is ja nur STUFF, falls ihr es einsetzen könnt freut's mich
__________________
one out of many
pius ist offline   Mit Zitat antworten
Alt 13-11-2003, 12:37   #12 (permalink)
-=|=-
 
Registriert seit: Jul 2001
Ort: münchen
Beiträge: 776
habt ihr fein gemacht............


eine interessante diskussion zum thema xml in array umwandeln

xml-verarbeitung in der anwendung

ich wünsch euch noch viel spaß in der arbeit
jazz ist offline   Mit Zitat antworten
Alt 13-11-2003, 13:45   #13 (permalink)
.--. .. ..- ...
 
Benutzerbild von pius
 
Registriert seit: Jul 2002
Ort: munich
Beiträge: 1.345
Zitat:
ich setzt trotzdem lieber auf die arrays

__________________
one out of many
pius ist offline   Mit Zitat antworten
Alt 26-11-2003, 15:57   #14 (permalink)
Neuer User
 
Registriert seit: Nov 2002
Beiträge: 53
hi,

funzt soweit 1a das script. leider bin ich auf folgendes problem gestossen:

sobald mein <nodename> einen bindestrich enthält (z.b. <title-text>) zeigt der debugger zwar alles richtig an (title-text_pcdata) aber wenn ich das array dann übers script anspreche liefert er leider nur 0

ich greife folgendermaßen auf das array zu:

_global.xmldata.animation[0].title-text[0].title-text_pcdata

ändere ich das ganze in

_global.xmldata.animation[0].title_text[0].title_text_pcdata

(natürlcih auch in der xml-datei)...geht es ohne probleme.

idee woran das liegen könnte??

wär cool, wenn du mir helfen könntest!

ciao
zero@work ist offline   Mit Zitat antworten
Alt 26-11-2003, 16:03   #15 (permalink)
Neuer User
 
Registriert seit: Nov 2002
Beiträge: 53
jo..alles klar.

scheint generell ein restriktion für variablen mit '-' zu geben...wird dann wahrscheinlich als Minus geparst.

ändere meine nodenames einfach in "konforme" schreibweisen
zero@work 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 14:01 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele