Zurück   Flashforum > Flash > ActionScript > ActionScript 1

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 13-07-2005, 14:42   #1 (permalink)
Durchschnitt
 
Registriert seit: Jul 2004
Beiträge: 89
verschachtelte XML Nodes mit Loop auslesen

Ich möchte ein XML mit allen Verschachtelungen auslesen, und für jeden Node einen MC erstellen. Das Script meiner Vorstellung sieht so aus:
ActionScript:
  1. function runXML (labelNode) {
  2.     for (i=labelNode.childNodes.length; i > 0; i--, r++) {
  3.         createLabel("label"+labelNode.childNodes[i].attributes.id);
  4.         for (this["j"+s]=labelNode.childNodes[i].childNodes.length; j > 0; j--) {
  5.             runXML(labelNode.childNodes[j]);
  6.         }
  7.     }
  8. }
  9. //----------------------------------------------------------------------------------------------------- loading xml
  10. labels = new XML();
  11. labels.ignoreWhite = true;
  12. labels.onLoad = function(ok) {
  13.     if (ok) {
  14.         trace("xml geladen");
  15.         runXML(labels.firstChild);
  16.     } else {
  17.         trace("nicht geladen");
  18.     }
  19. }
  20. labels.load('labels.xml');
Die Loops werden aber so nicht zu ende geführt. Ich denke, es liegt daran, dass die Variable "i" beim erneuten Aufruf der Funktion überschrieben wird. Ich müsste also einen flexiblen Variablen-Namen erstellen. Ist das richtig? Wenn ja, wie mache ich das?
zeroval ist offline   Mit Zitat antworten
Alt 13-07-2005, 18:36   #2 (permalink)
Durchschnitt
 
Registriert seit: Jul 2004
Beiträge: 89
Das war ein bisschen schluddrig von mir, obiges unaufgeräumtes Script zu posten. Hier ein aufgeräumteres Script zur rekursiven Schlaufe. Bricht aber noch immer nach der ersten Schlaufe ab. Weiss jemand wieso?:
ActionScript:
  1. function runXML (labelNode) {
  2.     trace("a labelNode = "+labelNode.attributes.id);
  3.     for (i=labelNode.childNodes.length; i > 0; i--) {
  4.         labelChildNode = labelNode.childNodes[i-1];
  5.         trace("b labelChildNode = "+labelChildNode.attributes.id);
  6.         createLabel("label"+labelNode.childNodes[i-1].attributes.id);
  7.         if (labelChildNode.hasChildNodes()) {
  8.             trace("c");
  9.             runXML(labelChildNode);
  10.         }
  11.     }
  12. }
  13. labels = new XML();
  14. labels.ignoreWhite = true;
  15. labels.onLoad = function(ok) {
  16.         if (ok) {
  17.                 trace("xml geladen");
  18.                 runXML(labels.firstChild);
  19.         } else {
  20.                 trace("nicht geladen");
  21.         }
  22. }
  23. labels.load('labels.xml');
Hier das XML, das ich verwende:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<home id='0_0_0_0' name='Home' x='20' y='300' color='0x000000'>
	<Label id='1_0_0_0' name='Label 1-0' type='a'>
		<Label id='1_1_0_0' name='Label 1-1' type='a'>
		</Label>
		<Label id='1_2_0_0' name='Label 1-2' type='a'>
		</Label>
		<Label id='1_3_0_0' name='Label 1-3' type='a'>
		</Label>
	</Label>
	<Label id='2_0_0_0' name='Label 2-0' type='a'>
		<Label id='2_1_0_0' name='Label 2-1' type='a'>
			<Label id='2_1_1_0' name='Label 2-1-1' type='a'>
				<Label id='2_1_1_1' name='Label 2-1-1-1' type='a'>
				</Label>
			</Label>
		</Label>
		<Label id='2_2_0_0' name='Label 2-2' type='a'>
		</Label>
		<Label id='2_3_0_0' name='Label 2-3' type='a'>
		</Label>
		<Label id='2_4_0_0' name='Label 2-4' type='a'>
		</Label>
	</Label>	
	<Label id='3_0_0_0' name='Label 3-0' type='a'>
		<Label id='3_1_0_0' name='Label 3-1' type='a'>
		</Label>
	</Label>
</home>
zeroval ist offline   Mit Zitat antworten
Alt 13-07-2005, 19:23   #3 (permalink)
muh
 
Benutzerbild von Janoscharlipp
 
Registriert seit: Apr 2002
Ort: Freiburg / Stuttgart
Beiträge: 4.338
Du hast deine Variablen nicht lokal definiert, also überschreiben sie sich...

so gehts:
ActionScript:
  1. function runXML (labelNode:XMLNode) {
  2.     var labelChildNode:XMLNode;
  3.     var i:Number;
  4.         trace("a labelNode = "+labelNode.attributes.id);
  5.         for (i=labelNode.childNodes.length; i > 0; i--) {
  6.                 labelChildNode = labelNode.childNodes[i-1];
  7.                 trace("b labelChildNode = "+labelChildNode.attributes.id);
  8.                 //createLabel("label"+labelNode.childNodes[i-1].attributes.id);
  9.                 if (labelChildNode.hasChildNodes()) {
  10.                         trace("c");
  11.                         runXML(labelChildNode);
  12.                 }
  13.         }
  14. }
__________________
»Carpe diem«, sagte der Graf. (Terry Pratchett: Ruhig Blut!)
Janoscharlipp ist offline   Mit Zitat antworten
Alt 13-07-2005, 19:30   #4 (permalink)
Durchschnitt
 
Registriert seit: Jul 2004
Beiträge: 89
Super! Vielen Dank, Janosch. Jetzt klappts.
zeroval ist offline   Mit Zitat antworten
Alt 07-08-2006, 02:44   #5 (permalink)
FREAK
 
Benutzerbild von mmgraphics
 
Registriert seit: Jul 2002
Ort: Rheda-Wiedenbrück
Beiträge: 115
Hi,

das auslesen funktioniert ja super.
Aber kann mir mal jemand sagen, wie ich anhand dieses Beispiels die verschiedenen unter-levels in ein verschachteltes Array eintrage?

Also z.B.

bb = new Array();
bb[0] = 1_0_0_0;
bb[0][0] = 1_1_0_0;

usw.

Danke für die Hilfe!

Gruß,
mm
__________________
mmgraphics
webDesign
mmgraphics ist offline   Mit Zitat antworten
Alt 07-08-2006, 02:46   #6 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.324
bb = new Array();
bb[0] = new Array();
...
bb[0][0] = new Array();
...
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de
hgseib ist offline   Mit Zitat antworten
Alt 07-08-2006, 02:50   #7 (permalink)
FREAK
 
Benutzerbild von mmgraphics
 
Registriert seit: Jul 2002
Ort: Rheda-Wiedenbrück
Beiträge: 115
Hallo hgseib,

danke für die schnelle Antwort, aber die Definition der Arrrays ist mir schon klar.

Mir ist nur unklar, wie ich das Ganze innerhalb der o.g. function runXML mache.
Da die Struktur der xml-Datei sich ändern kann, sollte das Array dynamisch erstellt werden, mit allen verschachtelungen.

Hast du ne Lösung für o.g. Funktion parat?

Wie würdest du das lösen? Mir qualmt echt schon der Schädel, aber ich muss das heute noch irgendwie hinbekommen ... äachz...

Danke dir schonmal.

Gruß,
mm
__________________
mmgraphics
webDesign
mmgraphics ist offline   Mit Zitat antworten
Alt 07-08-2006, 07:33   #8 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.324
sie dir das mal an:
http://www.seibsprogrammladen.de/fra...lgorithmen/xml
XML parsen

und neue arrays setzt du immer dann, wenn du eins brauchst, aber noch keins angelegt wurde.
if (! bb[0][0].length) bb[0][0]=[];
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de

Geändert von hgseib (07-08-2006 um 07:34 Uhr)
hgseib ist offline   Mit Zitat antworten
Alt 07-08-2006, 14:25   #9 (permalink)
FREAK
 
Benutzerbild von mmgraphics
 
Registriert seit: Jul 2002
Ort: Rheda-Wiedenbrück
Beiträge: 115
Exclamation

Mein Problem ist folgendes:

mein xml-document sieht in etwa so aus:
<nav ...>
<menu name="Leistungen" ...>
<menu name="Leistungen_a"..>
<eintrag name="IT-Security"...></eintrag>
<eintrag name="IT-Security2"...></eintrag>
</menu>
<menu name="Leistungen_b"..>
<menu name="Leistungen_b1"...>
<eintrag name="IP-Check"...></eintrag>
</menu>
<eintrag name="IT-Security"...></eintrag>
<eintrag name="IT-Security2"...></eintrag>
</menu>
</menu>
</nav>

Nur als Beispiel. Die Tiefe des xml-Documents ist hier halt bis 4, kann aber wenn der Kunde selber einträge vornimmt, ggf. auch tiefer werden.

Jetzt ist es so, dass ich per flash diesen xml-tree auslesen will, aber die Daten nicht sofort verwenden will, sondern vorerst in einem Multi-Dimensionalen Array ablegen möchte.

Also etwas in der Art: nav_arr[0][1][0][1], um z.B. IT-Security2 zu erhalten, oder nav_arr[0][1][0][0], um IT-Security1 zu bekommen.

Ich muss also in einer "rekursiven" Abfrage des xml-Dokuments diese Art von Array erhalten.

Und genau hier liegt mein Problem. Ich versuche mich schon seit Tagen, habe auch schon mehrfach das Forum hier abgegrast, aber ich finde immer nur Beispiele, die mir bei meinem problem nicht wirklich helfen, oder aber ich habe im Moment nen rostigen Nagel im Kopf ...

Ich bekomme es einfach nicht hin!

kann mir irgendjemand einen Code-Schnipsel konstruieren, um diese xml-struktur in ein mehrdimensionales Array abzulegen?

@hgseib: Vielen Dank für deinen Link zur parseXML, aber ich bekomme einfach nicht das mit dem Array hin. (bin momentan echt zu blöd, wahrscheinlich ist es super einfach, aber ich checks nicht...)

Wäre super, wenn mir hier jemand aus der Patsche helfen würde!

Beste Grüße,
mm
__________________
mmgraphics
webDesign
mmgraphics ist offline   Mit Zitat antworten
Alt 07-08-2006, 21:14   #10 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.324
sorry, wenn du noch nicht mal das einfache beispiel umsetzen kannst?
ich kann dir nicht dein programm schreiben.

schau mal in der flash-hilfe nach (und auch hier suchen) ob dir:
Xpath
weiter hilft?

"..aber die Daten nicht sofort verwenden will.."
du musst das XML nicht komplett in ein array umwandeln. du kannst genausogut deine daten erst dann aus dem XML ziehen, wenn du sie brauchst.
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de
hgseib ist offline   Mit Zitat antworten
Alt 07-08-2006, 21:32   #11 (permalink)
FREAK
 
Benutzerbild von mmgraphics
 
Registriert seit: Jul 2002
Ort: Rheda-Wiedenbrück
Beiträge: 115
ja, jetzt fühl ich mich wirklich doof... danke.

Ich will nicht alles gecoded haben, ich muss nur wissen, wie ich wo das Array erstelle und wo ich es verschachtele.

Sorry, dass man nicht alles wissen kann, auch wenn es in deinen Augen einfach ist.

Aber dafür ist dieses Forum ja da, soweit ich weiss...

trotzdem Danke.
__________________
mmgraphics
webDesign
mmgraphics ist offline   Mit Zitat antworten
Alt 08-08-2006, 16:44   #12 (permalink)
muh
 
Benutzerbild von Janoscharlipp
 
Registriert seit: Apr 2002
Ort: Freiburg / Stuttgart
Beiträge: 4.338
So, hier mal wie ich solche XML-Parser bastle, nach dem Konzept kann man sowas in 5 Minuten runterschreiben.

Du kannst den Code in deinen 1. Frame kopieren, und dann mit [strg]+[alt]+[v] angucken, was er gemacht hat.

Natürlich musst du es noch anpassen, aber das Prinzip ist immer das gleiche.

PHP-Code:
this.xml = new XML();
this.xml.ignoreWhite true;
this.xml.parseXML('<nav><menu name="Leistungen"><menu name="Leistungen_a"><eintrag name="IT-Security"></eintrag><eintrag name="IT-Security2"></eintrag></menu><menu name="Leistungen_b"><menu name="Leistungen_b1"><eintrag name="IP-Check"></eintrag></menu><eintrag name="IT-Security"></eintrag><eintrag name="IT-Security2"></eintrag></menu></menu></nav>');

this.parseXml = function(xml) {
    var 
data;
    
    var 
children xml.childNodes;
    
    var 
i;
    var 
children.length;
    
    for (
0li++) {
        if (
children[i].nodeName == "nav") {
            
data this.parseNav(children[i]);
            break;
        }
    }
    
    return 
data;
};

this.parseNav = function(xml) {
    var 
nav = new Object();
    
nav.sub = new Array();
    
    var 
children xml.childNodes;
    
    var 
i;
    var 
children.length;
    
    for (
0li++) {
        if (
children[i].nodeName == "menu") {
            
nav.sub.push(this.parseMenu(children[i]));
        } else if (
children[i].nodeName == "eintrag") {
            
nav.sub.push(this.parseEintrag(children[i]));
        }
    }
    
    return 
nav;
};

this.parseMenu = function(xml) {
    var 
menu = new Object();
    
menu.name xml.attributes.name;
    
menu.sub = new Array();
    
    var 
children xml.childNodes;
    
    var 
i;
    var 
children.length;
    
    for (
0li++) {
        if (
children[i].nodeName == "menu") {
            
menu.sub.push(this.parseMenu(children[i]));
        } else if (
children[i].nodeName == "eintrag") {
            
menu.sub.push(this.parseEintrag(children[i]));
        }
    }
    
    return 
menu;
};

this.parseEintrag = function(xml) {
    var 
eintrag = new Object();
    
eintrag.name xml.attributes.name;
    
    return 
eintrag;
};

this.data this.parseXml(this.xml); 
__________________
»Carpe diem«, sagte der Graf. (Terry Pratchett: Ruhig Blut!)
Janoscharlipp ist offline   Mit Zitat antworten
Alt 08-08-2006, 17:47   #13 (permalink)
FREAK
 
Benutzerbild von mmgraphics
 
Registriert seit: Jul 2002
Ort: Rheda-Wiedenbrück
Beiträge: 115
Hi Janoscharlipp!

Erst einmal vielen herzlichen Dank für das Beispiel, das du heir gepostet hast!!!

Ich habe es mal soweit umgeschrieben, dass ich eine externe xml-datei einlade, um die dann zu parsen.

Code:
this.xml = new XML();
this.xml.ignoreWhite = true;
this.xml.load("navigation.xml");
this.xml.onLoad = function(status){	
	if (status){
		this.parseXml(this.xml);
		//this.parseXML(this.xml);
		trace("Daten geladen...");	
		trace(nav.sub);
	}else{
		trace("Fehler:  Daten konnten nicht geladen werden!");
	}
};


this.parseXml = function(xml) {
    var data;
    
    var children = xml.childNodes;
    
    var i;
    var l = children.length;
    
    for (i = 0; i < l; i++) {
        if (children[i].nodeName == "nav") {
            data = this.parseNav(children[i]);
            break;
        }
    }
    return data;
};

this.parseNav = function(xml) {
    var nav = new Object();
    nav.sub = new Array();
    
    var children = xml.childNodes;
    
    var i;
    var l = children.length;
    
    for (i = 0; i < l; i++) {
        if (children[i].nodeName == "menu") {
            nav.sub.push(this.parseMenu(children[i]));
        } else if (children[i].nodeName == "eintrag") {
            nav.sub.push(this.parseEintrag(children[i]));
        }
    }
    
    return nav;
};

this.parseMenu = function(xml) {
    var menu = new Object();
    menu.name = xml.attributes.name;
    menu.sub = new Array();
    
    var children = xml.childNodes;
    
    var i;
    var l = children.length;
    
    for (i = 0; i < l; i++) {
        if (children[i].nodeName == "menu") {
            menu.sub.push(this.parseMenu(children[i]));
        } else if (children[i].nodeName == "eintrag") {
            menu.sub.push(this.parseEintrag(children[i]));
        }
    }
    return menu;
};

this.parseEintrag = function(xml) {
    var eintrag = new Object();
    eintrag.name = xml.attributes.name;
    
    return eintrag;
};
habe außer der Laderoutine nichts an deinem Script verändert.
Aber die trace-Anweisung liefert mir trotzdem nur "undefined"... Ich versuche grad herauszufinden, wie ich an die eingelesenen Daten komme... (peinlich)

Scheint irgendetwas nicht zu stimmen...
__________________
mmgraphics
webDesign
mmgraphics ist offline   Mit Zitat antworten
Alt 08-08-2006, 18:23   #14 (permalink)
muh
 
Benutzerbild von Janoscharlipp
 
Registriert seit: Apr 2002
Ort: Freiburg / Stuttgart
Beiträge: 4.338
Du musst auf die Scopes achten, onLoad wird im Sinne des XML-Objekts ausgeführt, da gibt es dann weder this.xml (denn das xml ist einfach nur this), noch gibt es this.parseXml (das ist ja auf _root definiert).
PHP-Code:
this.xml = new XML();
this.xml.ignoreWhite true;
this.xml.timeline this;
this.xml.load("navigation.xml");
this.xml.onLoad = function(status){    
    if (
status){
        
this.timeline.xmlLoaded();
    }else{
        
trace("Fehler:  Daten konnten nicht geladen werden!");
    }
};

this.xmlLoaded = function() {
    
this.data this.parseXml(this.xml);
        
// jetzt hast du data
}; 
__________________
»Carpe diem«, sagte der Graf. (Terry Pratchett: Ruhig Blut!)
Janoscharlipp ist offline   Mit Zitat antworten
Alt 08-08-2006, 18:49   #15 (permalink)
FREAK
 
Benutzerbild von mmgraphics
 
Registriert seit: Jul 2002
Ort: Rheda-Wiedenbrück
Beiträge: 115
Ich habe echt nen Nagel im Kopf...

wie rufe ich jetzt die Daten von data auf? Bin ich denn heute nur bekloppt?

Ich überlege grad, wie die Verschachtelung aussieht....

Gruß,
mm
__________________
mmgraphics
webDesign
mmgraphics 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:27 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele