Zurück   Flashforum > Flash > ActionScript > ActionScript 1

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 13-03-2007, 19:52   #1 (permalink)
// Knäckebrot
 
Benutzerbild von modul47
 
Registriert seit: Mar 2002
Ort: München
Beiträge: 283
2-dimensionales array aus xml befüllen

hi zusammen,

folgendes problem, wozu ich hier keine lösung finde:

ich hab ein xml, wo ich jeweils 2 abhängige einträge habe. das ganze soll in flash eingelesen und nach dem ersten wert sortiert werden. also benötige ich ja ein 2-dimensionales array, damit es die zusammenghörigen elemente im array bei sortieren nicht mischt.
die array "kunde" und "messe" benötige ich noch jeweils separat, also nicht wundern, dass die eigens ein aaray bekommen.
das relevante soll sein kundeRef.

ich habe ne zuweisung der inhalte in die arrays so gebaut:

Code:
kunde_array = new Array ();
messe_array = new Array ();
kundeRef_array = new Array();
	for (var y = 0; y < infoP_xml.childNodes [0].childNodes.length; y ++)
		{
		kunde_array [y] = infoP_xml.childNodes [0].childNodes [y].childNodes [1].childNodes [0].nodeValue;
		messe_array [y] = infoP_xml.firstChild.childNodes [y].childNodes [2].childNodes [0].nodeValue;
                kundeRef_array [y] = infoP_xml.childNodes [0].childNodes [y].childNodes [1].childNodes [0].nodeValue;
		for(var j=0;j<infoP_xml.childNodes [0].childNodes.length; j++){
			kundeRef_array[y][j] = infoP_xml.childNodes [0].childNodes [j].childNodes [2].childNodes [0].nodeValue;
		}
	}
es kommt da zwar was raus, aber nur die werte aus dem "kunden"array werden eingetragen, die "messe" bleibt aussen vor...

ein richtiges ergebniss wäre was ind er art wie array([kunde1, messe1],[kunde2, messe2],[kunde3, messe3]...)


was mach ich da falsch?

vielen dank
tom
__________________
www.flickr.com/photos/i47/ - auswahl meiner pics
www.i47.de - portfolio

Geändert von modul47 (14-03-2007 um 10:00 Uhr)
modul47 ist offline   Mit Zitat antworten
Alt 14-03-2007, 13:28   #2 (permalink)
// Knäckebrot
 
Benutzerbild von modul47
 
Registriert seit: Mar 2002
Ort: München
Beiträge: 283
weiß denn niemand was dazu? HILFE!!
__________________
www.flickr.com/photos/i47/ - auswahl meiner pics
www.i47.de - portfolio
modul47 ist offline   Mit Zitat antworten
Alt 14-03-2007, 14:12   #3 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 12.134
Zeig mal die XML.
Omega Psi ist offline   Mit Zitat antworten
Alt 14-03-2007, 15:09   #4 (permalink)
// Knäckebrot
 
Benutzerbild von modul47
 
Registriert seit: Mar 2002
Ort: München
Beiträge: 283
Auszug:
Code:
<?xml version="1.0" ?>
<root>
<item>	
		<thumb>00000000001.jpg</thumb>
		<kunde>NURIA</kunde>
		<messe>123</messe>
		<groesse>34 - 44</groesse>
		<as>24hrs, Moisture Permeability, Fully taped seams, Ergonomic cut</as> 
		<pics>00000000548.jpg,00000000550.jpg,00000000552.jpg,00000000554.jpg,00000000282.jpg</pics>
		<hl>0</hl>
 </item>
 <item>
 		<thumb>00000000050.jpg</thumb>
		<kunde>ASPEN</kunde>
		<messe>234</messe>
		<groesse>35 - 43</groesse>
		<as>24hrs, Moisture Permeability, Fully taped seams, Ergonomic cut</as> 
		<pics>00000000474.jpg,00000000476.jpg,00000000478.jpg,00000000480.jpg,00000000286.jpg</pics>
		<hl>1</hl>
 </item>


</root>
von diesen xml gibts dann 3, die alle in einer liste zusammengefasst werden müssen... da ich allerdings nicht alle einträge verwenden kann, sondern nur die die bei kunde und messe was stehen haben, muss ich sozusagen, erst 3 2d-arrays erstellen, die zsuammenfügen (push) und dieses dann nach Kunde sortieren...
__________________
www.flickr.com/photos/i47/ - auswahl meiner pics
www.i47.de - portfolio

Geändert von modul47 (14-03-2007 um 15:11 Uhr)
modul47 ist offline   Mit Zitat antworten
Alt 14-03-2007, 16:08   #5 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 12.134
Der Code für's erste Schlüsselbild, wenn du die XML lädst.
ActionScript:
  1. var array:Array = new Array();
  2. var xml:XML = new XML();
  3. xml.ignoreWhite = true;
  4. xml.load("test.xml");
  5. xml.onLoad = function(success:Boolean) {
  6.     if (success) {
  7.         trace("Data successfully loaded");
  8.         var root:XMLNode = this.firstChild;
  9.         for (var i:Number = 0; i<root.childNodes.length; i++) {
  10.             var client:Client = new Client();
  11.             for (var j:Number = 0; j<root.childNodes[i].childNodes.length; j++) {
  12.                 if (root.childNodes[i].childNodes[j].nodeName == "thumb") {
  13.                     trace("thumb");
  14.                     client.setThumb(root.childNodes[i].childNodes[j].firstChild.nodeValue);
  15.                     trace(client.getThumb());
  16.                 }
  17.             }
  18.             array.push(client);
  19.         }
  20.     } else {
  21.         trace("Error: file not found");
  22.     }
  23. };
Hier habe ich einen neuen Datentypen Client geschieben:
ActionScript:
  1. class Client {
  2.     private var thumb:String;
  3.     private var kunde:String;
  4.     private var messe:Number;
  5.     private var groesse:String;
  6.     private var as:String;
  7.     private var pics:String;
  8.     private var hl:String;
  9.     public function Client() {
  10.         trace("New client created");
  11.     }
  12.     public function getThumb():String {
  13.         return this.thumb;
  14.     }
  15.     public function setThumb(thumb:String) {
  16.         this.thumb = thumb;
  17.     }
  18. }
Du musst nur noch für die anderen Attribute get() und set()-Methoden schreiben. Dann kannst du selbst einen Sortieralgorithmus auf Basis von Bubble- oder Quicksort implementieren. Beispiel:
ActionScript:
  1. var temp:Client;
  2. if (array[i].getThumb() > array[i+1].getThumb()) {
  3.     temp = array[i];
  4.     array[i] = array[i+1];
  5.     array[i+1] = temp;
  6. }
Dies funktioniert dann analog bei allen Attributen.

Geändert von Omega Psi (14-03-2007 um 16:09 Uhr)
Omega Psi ist offline   Mit Zitat antworten
Alt 14-03-2007, 16:48   #6 (permalink)
// Knäckebrot
 
Benutzerbild von modul47
 
Registriert seit: Mar 2002
Ort: München
Beiträge: 283
ok, DANKE erstmal.

also, ich hab die class integriert, das xml-auslesen eingebaut und die class von Thumb auf Kunde umgebaut, denn thumb brauch ich in dem fall nicht... aber was ich nicht verstehe ist, wie ich das nun machen muss, damit das array 2d wird und wie ich das sortieren kann...

und was ist "Bubble- oder Quicksort"??

ich hab leider bis jetzt immer nur mit ein-dimensionalem gearbeitet und auch nie wirklich sortiert...

bis jetzt hab ichs so gemacht:
Code:
	kundeRefX = new Array ();
        // fügt die 3 arrays aus den 3 xmls zusammen
	refs_array.push (kundeRef_array);
	refs_array.push (kundeRef_array2);
	refs_array.push (kundeRef_array3);
        //sortiert das neue array
	kundeRefX = ref_array.split (",").sort ();
__________________
www.flickr.com/photos/i47/ - auswahl meiner pics
www.i47.de - portfolio
modul47 ist offline   Mit Zitat antworten
Alt 14-03-2007, 17:15   #7 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 12.134
Modifizierter Code im ersten Schlüsselbild:
Ich lade nacheinander 3 XML-Dateien und speichere die relevanten Daten in Client-Objekten. Diese Client-Objekte kommen alle in ein Array. Das Array lasse ich mir dann noch in traceArray(array:Array) ausgeben.
ActionScript:
  1. var paths:Array = new Array("test1.xml", "test2.xml", "test3.xml");
  2. var index:Number = 0;
  3. var array:Array = new Array();
  4. var xml:XML = new XML();
  5. xml.ignoreWhite = true;
  6. xml.load(paths[index]);
  7. xml.onLoad = function(success:Boolean) {
  8.     if (success) {
  9.         var root:XMLNode = this.firstChild;
  10.         for (var i:Number = 0; i<root.childNodes.length; i++) {
  11.             var client:Client = new Client();
  12.             for (var j:Number = 0; j<root.childNodes[i].childNodes.length; j++) {
  13.                 if (root.childNodes[i].childNodes[j].nodeName == "kunde") {
  14.                     client.setKunde(root.childNodes[i].childNodes[j].firstChild.nodeValue);
  15.                 }
  16.             }
  17.             array.push(client);
  18.         }
  19.         index++;
  20.         if (index<paths.length) {
  21.             trace(index);
  22.             this.load(paths[index]);
  23.         } else if (index == paths.length) {
  24.             traceArray(array);
  25.         }
  26.     } else {
  27.         trace("Error: file not found");
  28.     }
  29. };
  30. function traceArray(array:Array) {
  31.     trace("function traceArray() called.");
  32.     for (var i:Number = 0; i<array.length; i++) {
  33.         trace(array[i].getKunde());
  34.     }
  35. }
Du kannst dann anstatt der einfachen Ausgabe des Array das Array sortieren. Links zum Thema Sortier-Algorithmen gibt es zu Hauf im Netz. Der vollständigkeit halber noch die restlichen Klassen und Dateien:
ActionScript:
  1. class Client {
  2.     private var thumb:String;
  3.     private var kunde:String;
  4.     private var messe:Number;
  5.     private var groesse:String;
  6.     private var as:String;
  7.     private var pics:String;
  8.     private var hl:String;
  9.     public function Client() {
  10.     }
  11.     public function getKunde():String {
  12.         return this.kunde;
  13.     }
  14.     public function setKunde(kunde:String) {
  15.         this.kunde = kunde;
  16.     }
  17. }
Und die drei XML:
  • test1.xml:
    Code:
    <?xml version="1.0" ?><root><item><thumb>00000000001.jpg</thumb><kunde>NURIA</kunde><messe>123</messe><groesse>34 - 44</groesse><as>24hrs, Moisture Permeability, Fully taped seams, Ergonomic cut</as><pics>00000000548.jpg, 00000000550.jpg, 00000000552.jpg, 00000000554.jpg, 00000000282.jpg</pics><hl>0</hl></item><item><thumb>00000000050.jpg</thumb><kunde>ASPEN</kunde><messe>234</messe><groesse>35 - 43</groesse><as>24hrs, Moisture Permeability, Fully taped seams, Ergonomic cut</as> <pics>00000000474.jpg, 00000000476.jpg, 00000000478.jpg, 00000000480.jpg, 00000000286.jpg</pics><hl>1</hl></item></root>
  • test2.xml:
    Code:
    <?xml version="1.0" ?><root><item><thumb>00000000001.jpg</thumb><kunde>Sony</kunde><messe>123</messe><groesse>34 - 44</groesse><as>24hrs, Moisture Permeability, Fully taped seams, Ergonomic cut</as><pics>00000000548.jpg, 00000000550.jpg, 00000000552.jpg, 00000000554.jpg, 00000000282.jpg</pics><hl>0</hl></item><item><thumb>00000000050.jpg</thumb><kunde>Kairo</kunde><messe>234</messe><groesse>35 - 43</groesse><as>24hrs, Moisture Permeability, Fully taped seams, Ergonomic cut</as> <pics>00000000474.jpg, 00000000476.jpg, 00000000478.jpg, 00000000480.jpg, 00000000286.jpg</pics><hl>1</hl></item></root>
  • test3.xml:
    Code:
    <?xml version="1.0" ?><root><item><thumb>00000000001.jpg</thumb><kunde>AEG</kunde><messe>123</messe><groesse>34 - 44</groesse><as>24hrs, Moisture Permeability, Fully taped seams, Ergonomic cut</as><pics>00000000548.jpg, 00000000550.jpg, 00000000552.jpg, 00000000554.jpg, 00000000282.jpg</pics><hl>0</hl></item><item><thumb>00000000050.jpg</thumb><kunde>Tokio</kunde><messe>234</messe><groesse>35 - 43</groesse><as>24hrs, Moisture Permeability, Fully taped seams, Ergonomic cut</as> <pics>00000000474.jpg, 00000000476.jpg, 00000000478.jpg, 00000000480.jpg, 00000000286.jpg</pics><hl>1</hl></item></root>
Die Ausgabe:
Zitat:
1
2
function traceArray() called.
NURIA
ASPEN
Sony
Kairo
AEG
Tokio
Omega Psi ist offline   Mit Zitat antworten
Alt 14-03-2007, 19:14   #8 (permalink)
// Knäckebrot
 
Benutzerbild von modul47
 
Registriert seit: Mar 2002
Ort: München
Beiträge: 283
wow, super, du hast dir ja richtig zeit genommen! danke!
funktioniert alles prima!

aber eine verständnisfrage habe ich noch:
wie kann ich nun auf das 2. element im array zugreifen?
ich muss ja abfragen, ob das feld "messe" leer oder nicht leer ist...

was ich auch nicht verstehe ist, warum "messe" in der class als Number definiert ist... hängt das mit den beispieleinträgen zusammen? wird wahrscheinlich irgendwann text werden...

DICKES DANKE!!
tom
__________________
www.flickr.com/photos/i47/ - auswahl meiner pics
www.i47.de - portfolio
modul47 ist offline   Mit Zitat antworten
Alt 14-03-2007, 19:31   #9 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 12.134
Mit
ActionScript:
  1. if((array[i].get<AttributeName> == undefined) || (array[i].get<AttributeName> == null)) {
  2.     // Do something.
  3. }
kannst du das auf null oder undefined testen.

Das Array, dass alle Kunden - in der XML-Datei sind die Kunden-Attribute unter <item></item> zusammengefasst - benötigt dank der Klassenstruktur kein zweites Array. Alle Daten eines Kunden werden in dem Objekt gepeichert und sind über die get()-Methoden zugreifbar.

Im Konstruktur eines Client würde ich auch default Wert setzen, wie einen leeren String und ausserdem noch Methoden schreiben, die die Pfade der Bilder beispielsweise in Arrays aus dem String kovertiert.

Die Deklaration als Number von messe hängt mit den Beispielen zusammen.
Omega Psi ist offline   Mit Zitat antworten
Alt 15-03-2007, 09:41   #10 (permalink)
// Knäckebrot
 
Benutzerbild von modul47
 
Registriert seit: Mar 2002
Ort: München
Beiträge: 283
ok. das hab ich jetzt mal ausprobiert und die abfrage funtkioniert prima. danke dafür.
was mich aber noch interessiert ist, ob ich da wirklich nur, so wie ich es verstanden habe, abfragen kann, ob der wert vorhanden ist, z.b. so:
Code:
i=0;
if((array[i].get.messe != undefined) || (array[i].get.messe != null)) {
		trace("foo");
	}
oder ob ich auch den inhalt von "messe" ausgeben, bzw. abfragen kann...
ich hab schon etwas rumprobiert, bekomm aber nix getraced, was sich von undefined unterscheidet...

wenn ich also das so mache:
Code:
i=0;
if((array[i].get.messe != undefined) || (array[i].get.messe != null)) {
		trace(array[i].get.messe)
	}
passiert nix.
wenn ichs mir nur ausgebe
Code:
i=0;
trace(array[i].get.messe)
krieg ich ein undefined, obwohl ich mir ja sicher bin, dass da z.b. was wie "123" rauskommen sollte...

ich wurstl mich grad durch die flashhilfe und durchs forum und find irgendwie nichts konkretes raus dabei...
muss mich wohl mehr mit as2 auseinandersetzen in zukunft...
sry, dass ich so schwer von begriff bin...
tom
__________________
www.flickr.com/photos/i47/ - auswahl meiner pics
www.i47.de - portfolio

Geändert von modul47 (15-03-2007 um 09:42 Uhr)
modul47 ist offline   Mit Zitat antworten
Alt 15-03-2007, 13:05   #11 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 12.134
Ich habe das im Code für die Messe angepasst. Der rest erfolgt analog zu meinem Beispiel.
Angehängte Dateien
Dateityp: zip ClientExample.zip (6,6 KB, 9x aufgerufen)
Omega Psi ist offline   Mit Zitat antworten
Alt 15-03-2007, 13:17   #12 (permalink)
// Knäckebrot
 
Benutzerbild von modul47
 
Registriert seit: Mar 2002
Ort: München
Beiträge: 283
cool
jetzt hab ich gecheckt, wie's funzt....
jetzt werd ich mich mal ans sortieren machen...

ich geb dir mal n bier aus, wenn ich bei dir in der nähe bin

wenn das projekt fertig ist, werd ichs hier im ofrum mal vorstellen, ich glaub das wird ganz nett

vielen vielen dank!
tom
__________________
www.flickr.com/photos/i47/ - auswahl meiner pics
www.i47.de - portfolio
modul47 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 19:55 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele