Zurück   Flashforum > Flash > ActionScript > ActionScript 3

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 24-01-2012, 08:14   #1 (permalink)
Neuer User
 
Benutzerbild von Danjy
 
Registriert seit: Apr 2010
Beiträge: 122
XML und Array - Beliebige Werte in Array schreiben

Hallo liebes Forum,

ich habe momentan ein kleines Problem mit meinem Array welches ich aus einer XML hole.

Und zwar möchte ich mein Array dynamisch zusammen bauen, d.h ohne zu wissen was mir die XML liefert ein mehrdimensionales Array bauen.

Ich glaube am Script kann ich es besser erklären.

Meine XML sieht wie folgt aus:
PHP-Code:
<?xml version="1.0" encoding="utf-8"?>
<presentation>
    <folie nr="0" name="Titel">
        <vorlage>titel</vorlage>
        <animation>open</animation>
        <handXY>100,500</handXY>
        <text1>Text</text1>
        <text2>Text</text2>
        <text3>Text</text3>
        <text4>Text</text4>
        <text5>Text</text5>
        <pic>Picture</pic>
        <videopfad>videopfad</videopfad>
    </folie>
    
    <folie nr="1" name="Text 1">
        <vorlage>titel</vorlage>
        <animation>close</animation>
        <handXY>100,500</handXY>
        <text1>text</text1>
        <text2>text</text2>
        <text3>text</text3>
        <text4>text</text4>
        <text5>text</text5>
        <text3>text</text6>
        <text4>text</text7>
        <text5>text</text8>
        <text3>text</text9>
        <text4>text</text10>
        <text5>text</text11>
    </folie>
</presentation>
Hier meine bisherige AS3-Funktion:
PHP-Code:
var xmlLoader:URLLoader = new URLLoader();
xmlLoader.addEventListener(Event.COMPLETEshowXML);
xmlLoader.load(new URLRequest("config.xml"));

var 
contenArray:Array = new Array();

function 
showXML(e:Event):void{
    
XML.ignoreWhitespace true;
    
XML.ignoreComments true;
    
    var 
presentation:XML = new XML(e.target.data);
    var 
i:Number;
        
    
trace("Es wurden "+presentation.folie.length()+" Folien angelegt.\n");
    
    for (
i=0presentation.folie.length(); i++){        
        
        
contenArray[i] = [presentation.folie[i].vorlage.text(),
                          
presentation.folie[i].animation.text(),
                          
presentation.folie[i].handXY.text(),
                          
presentation.folie[i].text1.text(),
                          
presentation.folie[i].text2.text(),
                          
presentation.folie[i].text3.text(),
                          
presentation.folie[i].text4.text(),
                          
presentation.folie[i].text5.text(),
                          
presentation.folie[i].pic.text(),
                          
presentation.folie[i].videopfad.text()];
    }
    
    
startPresentation();

Hier sieht man schon, dass die Inhalte der <folie> sich unterscheiden.
Und hier liegt auch schon das Problem, ich möchte in AS3 eine Funktion bauen, die mir egal was in <folie> steht ein Array mit diesen werten schreibt.

Also ohne zu wissen welche Werte ich bekomme, also müsste ich folgendes umbauen:
PHP-Code:
contenArray[i] = [presentation.folie[i].vorlage.text(),
                          
presentation.folie[i].animation.text(),
                          
presentation.folie[i].handXY.text(),
                          
presentation.folie[i].text1.text(),
                          
presentation.folie[i].text2.text(),
                          
presentation.folie[i].text3.text(),
                          
presentation.folie[i].text4.text(),
                          
presentation.folie[i].text5.text(),
                          
presentation.folie[i].pic.text(),
                          
presentation.folie[i].videopfad.text()]; 
Und hier eine schleife machen der mir egal was in der XML steht raus holt..

Undzwar so, dass ich auf entsprechende Werte so:
PHP-Code:
contenArray[i,"text5"];
// foliennummer, tagname
// foliennummer ist ein einfacher cnt den ich später mit einer taste durchseppe 
zugreifen kann.

Ich hoffe Ihr versteht mein Problem und es ist überhaupt möglich!
Vielen Dank im vorraus!

Gruß Danjy

Geändert von Danjy (24-01-2012 um 08:17 Uhr)
Danjy ist offline   Mit Zitat antworten
Alt 24-01-2012, 08:54   #2 (permalink)
Keine Panik
 
Registriert seit: Apr 2010
Ort: Düsseldorf (im ernst)
Beiträge: 1.868
Zitat:
contenArray[i,"text5"];
PHP-Code:
//wenn schon, dann so:
contentArray[i]["text5"];
//oder
contentArray[i].text5
PHP-Code:
Ich hoffe Ihr versteht mein Problem und es ist überhaupt möglich!
Vielen Dank im vorraus
ja es geht
PHP-Code:
var contentArray:Array = [];
for 
each(var $folie:XML in xml.folie) {
    var 
folie:Object = {
            
nrparseInt($folie.@nr10), 
            
name$folie.@name.toString()
        };
    
contentArray.push(folie);
        
    for 
each(var $field:XML in $folie.elements()) {
        
folie[$field.localName()] = $field.toString();
    }

kann man aber besser machen. Strukturier die XML-Datei besser so:
Code:
<folie nr="0" name="Titel">
	<field name="vorlage">titel</field>
	<field name="animation">open</field>
	<field name="handXY">100,500</field>
	<field name="text1">Text</field>
	<field name="text2">Text</field>
	<field name="text3">Text</field>
	<field name="text4">Text</field>
	<field name="text5">Text</field>
	<field name="pic">Picture</field>
	<field name="videopfad">videopfad</field>
</folie>
ist hübscher, und man kann die Struktur um weitere Eigenschaften erweitern, ohne dass diese automatisch als solche Textfelder interpretiert werden.
und vom parsen her ändert sich auch nur folgende Zeile
PHP-Code:
folie[$field.@name] = $field.toString(); 
__________________
greetz Thomas

plz RTFM & Coding Conventions
thomas_E ist offline   Mit Zitat antworten
Alt 24-01-2012, 08:59   #3 (permalink)
Neuer User
 
Benutzerbild von Danjy
 
Registriert seit: Apr 2010
Beiträge: 122
Hey super vielen Dank,

bekomme nur noch einen kleinen Fehler und noch keine ausgabe:
PHP-Code:
function showXML(e:Event):void{
    
XML.ignoreWhitespace true;
    
XML.ignoreComments true;
    
    var 
presentation:XML = new XML(e.target.data);
    var 
i:Number;
        
    
trace("Es wurden "+presentation.folie.length()+" Folien angelegt.\n");
    
    var 
contentArray:Array = [];
    for 
each(var $folie:XML in xml.folie) { //<---
        
var folie:Object = {
                
nrparseInt($folie.@nr10), 
                
name$folie.@name.toString()
            };
        
contentArray.push(folie);
            
        for 
each(var $field:XML in $folie.elements()) {
            
folie[$field.@name] = $field.toString();
        }
    }  
    
    
trace(contentArray);
    
startPresentation();

Szene 1, Ebene 'AS - Parse', Bild 1, Zeile 30 1120: Zugriff auf eine nicht definierte Eigenschaft xml.



**EDIT**

natürlich.. heisst ja nicht xml sondern preasentation ^^

allerdings bekomme ich in meinem Array nur

Zitat:
[object Object],[object Object]

**EDIT 2**

habs dank dir!!

Geändert von Danjy (24-01-2012 um 09:05 Uhr)
Danjy ist offline   Mit Zitat antworten
Alt 24-01-2012, 09:07   #4 (permalink)
Neuer User
 
Benutzerbild von Danjy
 
Registriert seit: Apr 2010
Beiträge: 122
Wie könnte ich mir denn jetzt in Flash den Inhalt von Object anzeigen lassen?

also nicht nur
PHP-Code:
trace(contentArray[currentFoil]["Text1"]); 
sonder den kompletten Inhalt, alles was er in sich hat?

mit
Zitat:
contentArray[currentFoil]
bekomme ich leider auch nur [object Object]

Geändert von Danjy (24-01-2012 um 09:09 Uhr)
Danjy ist offline   Mit Zitat antworten
Alt 24-01-2012, 09:30   #5 (permalink)
Flash-Designer
 
Benutzerbild von Martin Kraft
 
Registriert seit: May 2006
Ort: Wiesbaden
Beiträge: 6.162
Edit: Wurde irgendwie mehrfach überrundet
Zitat:
Zitat von Danjy Beitrag anzeigen
Meine XML sieht wie folgt aus:
PHP-Code:
<?xml version="1.0" encoding="utf-8"?>
<presentation>
    <folie nr="0" name="Titel">
        <vorlage>titel</vorlage>
        <animation>open</animation>
        <handXY>100,500</handXY>
        <text1>Text</text1>
        <text2>Text</text2>
        <text3>Text</text3>
        <text4>Text</text4>
        <text5>Text</text5>
        <pic>Picture</pic>
        <videopfad>videopfad</videopfad>
    </folie>
    
    <folie nr="1" name="Text 1">
        <vorlage>titel</vorlage>
        <animation>close</animation>
        <handXY>100,500</handXY>
        <text1>text</text1>
        <text2>text</text2>
        <text3>text</text3>
        <text4>text</text4>
        <text5>text</text5>
        <text3>text</text6>
        <text4>text</text7>
        <text5>text</text8>
        <text3>text</text9>
        <text4>text</text10>
        <text5>text</text11>
    </folie>
</presentation>
Enthalten diese <textX>-Nodes gleichartige Inhalte? Wenn ja würde ich sie nicht durchnummerieren!

Zitat:
Zitat von Danjy Beitrag anzeigen
Undzwar so, dass ich auf entsprechende Werte so:
PHP-Code:
contenArray[i,"text5"];
// foliennummer, tagname
// foliennummer ist ein einfacher cnt den ich später mit einer taste durchseppe 
zugreifen kann.

Ich hoffe Ihr versteht mein Problem und es ist überhaupt möglich!
In dieser Form nicht. Zwei Werte innerhalb von [] sind unzulässig. Das ist kein valides AS3. Wenn dann sollte das so aussehen:
ActionScript:
  1. contenArray[i]["text5"];
Zitat:
Zitat von Danjy Beitrag anzeigen
Und hier eine schleife machen der mir egal was in der XML steht raus holt..
Das sähe so aus:
ActionScript:
  1. var contenArray:Array = [];
  2. var elemente:Object;
  3.  
  4. var folienXml:XML;
  5. var elementXml:XML;
  6.  
  7. for each(folienXml in presentation.folie) {
  8.     elemente = {};
  9.     for each (elementXml in folienXml.children()) {
  10.         elemente[elementXml.localName()] = elementXml.text();
  11.     }
  12.     contenArray.push(elemente);
  13. }
Allerdings wirst Du mit diesem System Probleme bekommen, sobald Du unterhalb von folie zwei Nodes hast, die gleich heißen!

Je nach dem was Du vorhast, würde ich Dir sogar empfehlen ganz auf das Array zu verzichten und Dir Deine Inhalte direkt aus dem XML zu parsen...
__________________
Viele Grüße // Martin

Martin Kraft // Interaktionsdesign

Hilfreiche Websites:
// Hilfe zur Adobe Flash Plattform
// ActionScript 2 Referenz
// ActionScript 3 Referenz
// ActionScript 3 Arbeitshandbuch
// weitere Flash Ressourcen

Bitte keine Flashfragen per PM oder Profilnachricht! Dafür ist das Forum da!

Geändert von Martin Kraft (24-01-2012 um 09:31 Uhr)
Martin Kraft ist offline   Mit Zitat antworten
Alt 24-01-2012, 09:51   #6 (permalink)
Neuer User
 
Benutzerbild von Danjy
 
Registriert seit: Apr 2010
Beiträge: 122
Danke,

ich habe vor eine Art presäntation zu bauen...
Am Anfang möchte ich alle Inhalte aus einer XML holen und in ein Array schreiben thats it.

PHP-Code:
for each(var $folie:XML in presentation.folie) {
        var 
folie:Object = {
                
nrparseInt($folie.@nr10), 
                
name$folie.@name.toString()
            };
        
contentArray.push(folie);
            
        for 
each(var $field:XML in $folie.elements()) {
            
folie[$field.@name] = $field.toString();
        }
    } 
Die Variante von Thomas klappt ja schon super, allerdings würde ich gerne prüfen / sehen können was in dem Objekt steckt.

Ich möchte mir vorlagen.swf's bauen die bestimmte Werte empfangen..
soll heißen ich habe eine Vorlage mit Textfield1 und textfield2 und diesen übergebe ich dann text1 und text2 aus der XML..

jetzt würde ich gerne prüfen ob Text1 und Text2 wirklich existiert... klappt ja wenn ich drauf zugreife und undefined rausbekomme auch ganz gut.

aber ich hätte gerne auch eine kleine "debug"-Übersicht die mir anzeigt was sich alles im Objekt verbiergt..

Hab noch nie wirklich mit Objecten gearbeitet und bekomme es nicht hin mir eine kleine Trace-Übersicht auszugeben mit den Attributen + Werten die in dem Object stecken.

wollte mir ersteinmal die Objectlänge holen mit:
PHP-Code:
function getLength(o:Object):uint{
    var 
len:uint 0;
    for (var 
item:* in o)
            
len++;
    return 
len;

allerdings scheint es mir als würde ich hier eine falsche anzahl von Objecteintraegen bekommen... in der XML sind 10 Elemente, bekomme bei der länge aber leider 12 raus... also
  • Objectinhalt übersicht

da hängts momentan,
sonst schonmal vielen dank ihr habt mir schon sehr weitergeholfen!

und was das
PHP-Code:
contenArray[i,"text5"]; 
angeht.. ja^^
sorry war nen copyfehler natürlich
PHP-Code:
contenArray[i]["text5"]; 

Geändert von Danjy (24-01-2012 um 10:04 Uhr)
Danjy ist offline   Mit Zitat antworten
Alt 24-01-2012, 10:57   #7 (permalink)
Neuer User
 
Registriert seit: Jul 2005
Beiträge: 44
Zitat:
aber ich hätte gerne auch eine kleine "debug"-Übersicht die mir anzeigt was sich alles im Objekt verbiergt..
hi, hast du's schon mit describeType() versucht?
flash.utils - Details ActionScript® 3.0 Referenzhandbuch für die Adobe® Flash®-Plattform

ich nutze hin und wieder auch das hier:

PHP-Code:
package
{
    final public class 
ObjectUtil
    
{
        public static function 
traceObj(obj Object) : void
        
{
            
_trace(obj0);
        }
        
        private static function 
_trace(obj Objectdepthint) : void 
        
{
            for (var 
name String in obj) {
                var 
hasNested Boolean = (typeof obj[name] == "object" && obj[name] != null);
                
                if (
hasNested) {
                    
trace (depth getIndentation(depth) + "| " + (isNaN(Number(name))? name "array item #" name) + getType(obj));
                    
_trace(obj[name], depth 1);
                }
                else {
                    
trace (depth getIndentation(depth) + "- " name " : " obj[name] + getType(obj));
                }
            }
        }
        
        private static function 
getIndentation(depthint) : String 
        
{
            var 
str String "";
            for (var 
int 0depthi++) {
                
str += "\t";
            }
            return 
str;
        }
        
        private static function 
getType(obj Object) : String 
        
{
            return 
" [" + ((obj is Array)? "array" : (typeof obj)) + "]";
        }
    }

_malte ist offline   Mit Zitat antworten
Alt 24-01-2012, 11:08   #8 (permalink)
Neuer User
 
Benutzerbild von Danjy
 
Registriert seit: Apr 2010
Beiträge: 122
Wow super Funktion dank dir vielmals!!!
Danjy ist offline   Mit Zitat antworten
Alt 24-01-2012, 11:29   #9 (permalink)
Flash-Designer
 
Benutzerbild von Martin Kraft
 
Registriert seit: May 2006
Ort: Wiesbaden
Beiträge: 6.162
Ich versteh immer noch nicht, warum Du das XML unbedingt erst in eine dynamische Objekt-Syntax überführen willst, die im besten Fall das abbildet, was auch im XML steht, im schlimmsten Fall an Node-Doupleten scheitert und letztlich auch nicht einfacher zu handhaben ist als das XML
In diesem Fall ist es IMHO (auch dank E4X) einfacher direkt mit dem XML zu arbeiten!
__________________
Viele Grüße // Martin

Martin Kraft // Interaktionsdesign

Hilfreiche Websites:
// Hilfe zur Adobe Flash Plattform
// ActionScript 2 Referenz
// ActionScript 3 Referenz
// ActionScript 3 Arbeitshandbuch
// weitere Flash Ressourcen

Bitte keine Flashfragen per PM oder Profilnachricht! Dafür ist das Forum da!

Geändert von Martin Kraft (24-01-2012 um 11:31 Uhr)
Martin Kraft ist offline   Mit Zitat antworten
Alt 24-01-2012, 12:51   #10 (permalink)
Neuer User
 
Benutzerbild von Danjy
 
Registriert seit: Apr 2010
Beiträge: 122
hm, ich kann dir da nicht ganz folgen.. hast du ein kleines Beispiel parat?

Ich möchte die eingeladenen SWF's mit dem entsprechenden Inhalt füllen welches ich vorher aus der XML geladen habe...

Dachte es wäre die einfachste Möglichkeit..
Danjy ist offline   Mit Zitat antworten
Alt 24-01-2012, 14:06   #11 (permalink)
Flash-Designer
 
Benutzerbild von Martin Kraft
 
Registriert seit: May 2006
Ort: Wiesbaden
Beiträge: 6.162
Zitat:
Zitat von Danjy Beitrag anzeigen
Ich möchte die eingeladenen SWF's mit dem entsprechenden Inhalt füllen welches ich vorher aus der XML geladen habe...
Na, dann nimm doch einfach diese Inhalte direkt aus dem XML ohne vorher den Umweg über ein Objekt zu gehen!
Letzteres macht nämlich IMHO nur dann Sinn, wenn man dabei auch die Typen und die Struktur irgendwie festlegt und überprüft, was hier offen sichtlich nicht der Fall ist.
__________________
Viele Grüße // Martin

Martin Kraft // Interaktionsdesign

Hilfreiche Websites:
// Hilfe zur Adobe Flash Plattform
// ActionScript 2 Referenz
// ActionScript 3 Referenz
// ActionScript 3 Arbeitshandbuch
// weitere Flash Ressourcen

Bitte keine Flashfragen per PM oder Profilnachricht! Dafür ist das Forum da!
Martin Kraft ist offline   Mit Zitat antworten
Alt 24-01-2012, 15:15   #12 (permalink)
Keine Panik
 
Registriert seit: Apr 2010
Ort: Düsseldorf (im ernst)
Beiträge: 1.868
Zitat:
allerdings scheint es mir als würde ich hier eine falsche anzahl von Objecteintraegen bekommen... in der XML sind 10 Elemente, bekomme bei der länge aber leider 12 raus... also
ich hab am Anfang die id und den Namen der Folie mit in das Object geschrieben

Zitat:
Hab noch nie wirklich mit Objecten gearbeitet und bekomme es nicht hin mir eine kleine Trace-Übersicht auszugeben mit den Attributen + Werten die in dem Object stecken.
PHP-Code:
trace("tracing"obj);
for(var 
key:String in obj)
    
trace('    prop "'key +'" => "'objkey ] +'"'); 

PHP-Code:
//statt 
contenArray[i]["text5"];

//machst du folgendes:
var folie:XML preasentation.folie[i];  //alias aktuelleFolie

someTF1.text folie.text1;
someTF2.text folie.text2;
...

//am besten vorher prüfen, ob das Feld existiert
if(folie.hasOwnProperty("text1")) ...
if(
folie.text1.length()) ...
//oder direkt eine Alternative anbieten:
someTF1.text folie.text1 || "some default Text"
__________________
greetz Thomas

plz RTFM & Coding Conventions
thomas_E ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Stichworte
array, xml

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


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Interpolation Werte Array tomtm ActionScript 3 18 23-01-2011 17:59
Array in Array schreiben hmp ActionScript 2 2 16-10-2007 00:18
Array, Werte eintragen, Werte löschen Grille ActionScript 1 3 28-02-2007 17:03
array aus flash an php als array, über 80000 Werte huegenbegger PHP und MySQL 28 18-08-2005 15:57
in array schreiben FroX PHP und MySQL 6 06-02-2004 12:46


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:46 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele