Flashhilfe.de - Flash Community

Referenzierung auf Array Hirachie [Flash 9]

 


AntwortenRegistrieren Seite1  

cttogo#1
Benutzerbild von cttogo
Beiträge: 313
Wohnort: Waltrop
Registriert: Jul 2008

10.08.2008, 10:49

Hallo Forum Members,

da ich mittlerweile weis, warum das Problem in meinem Beitrag
http://www.flashhilfe.de/forum/actionscript-3-0/mehrdimensionaler-array-wir-nicht-korrekt-gefuellt-243075-243075.html
auftrit, versuche ich mich jetzt an der Lösung

In der Funktion:
ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function walkXML(node:XMLNode, depth:Number):Void {
   if (!depth) {
      var depth:Number = 0;
   }
   var len:Number = node.childNodes.length;
   for (var i:Number = 0; i < len; i++) {
      if (node.childNodes[i].parentNode.nodeName == null) {
         _array[node.childNodes[i].nodeName] = new Array();
      } else {
         if (node.childNodes[i].nodeType == 1) {
            _array[node.childNodes[i].parentNode.nodeName][node.childNodes[i].nodeName] = new Array();
         } else if (node.childNodes[i].nodeType == 3) {
            trace(node.childNodes[i].parentNode.nodeName + ' has the Value ' + node.childNodes[i].toString());
         }
      }
      if (node.childNodes[i].hasChildNodes) {
         walkXML(node.childNodes[i],depth + 1);
      }
   }
   
}

müsste es an der Stelle
ActionScript:
1
2
3
if (node.childNodes[i].nodeType == 1) {
_array[node.childNodes[i].parentNode.nodeName][node.childNodes[i].nodeName] = new Array();
}

eigendlich
ActionScript:
1_array[*Die bisherige Hirachie*][* bis node.childNodes[i].parentNode.nodeName*][node.childNodes[i].nodeName] = new Array();

heißen. Gibt es eine Möglichkeit eine Referenzierung auf die Hirachie des Arrays zu erhalten / erstellen?

Mir schwebt etwas in der Art von (Änderungen in rot)
ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
function walkXML(node:XMLNode, depth:Number, ref:String):Void {
   if (!depth) {
      var depth:Number = 0;
   }
   if (ref) {
      var ref:String = '';
   }
   if(depth == 0){
      ref = '';
   }

   var len:Number = node.childNodes.length;
   for (var i:Number = 0; i < len; i++) {
      if (node.childNodes[i].parentNode.nodeName == null) {
         _array[node.childNodes[i].nodeName] = new Array();
         ref += node.childNodes[i].nodeName;
      } else {
         if (node.childNodes[i].nodeType == 1) {
            _array[*ref to Array* ][node.childNodes[i].nodeName] = new Array();
            ref += node.childNodes[i].nodeName;

         } else if (node.childNodes[i].nodeType == 3) {
            trace(node.childNodes[i].parentNode.nodeName + ' has the Value ' + node.childNodes[i].toString());
         }
      }
      if (node.childNodes[i].hasChildNodes) {
         walkXML(node.childNodes[i],depth + 1,ref);
      }
   }
   
}


Ich hoffe es ist nicht zu Verwirrend.

Danke fürs lesen, hoffend auf Hilfe.

Tom
Irgenwas läuft immer schief!
Werbung
Beiträge: 0
Registriert: Feb 2016


Sebastian#2
Benutzerbild von SebastianFlashhilfe.de Moderator
Beiträge: 6981
Wohnort: München
Registriert: Jan 2002

11.08.2008, 10:22

Kannst Du bitte die Lösung im anderen Thread posten?

Zu der Frage in diesem Thread.
Leider verstehe ich das Problem nicht, allerdings sieht Deine Funktion so aus als würdest Du eine Rekursion erstellen wollen?
JavaScript & JavaFX Freelancer || Flashhilfe @ Twitter || XING Profil
cttogo#3
Benutzerbild von cttogo
Beiträge: 313
Wohnort: Waltrop
Registriert: Jul 2008

Themenautor/in

11.08.2008, 10:46

Hallo Sebastian,

ich möchte einen Parser schreiben der mir jede XML Daten in einen Array schreibt.

Beispiel:
Diese XML Daten
ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0" encoding="UTF-8"?>
<response status="OK" sessionid="v823z8" expiretime="240000">
        <subscription subHandle="U0RXdJ" subExpireTime="60000">
                <statuslists>
                        <statuslist uid="VlOe8v8Im0">
                                <status name="POWER">
                                        <property name="value">false</property>
                                </status>
                        </statuslist>
                </statuslists>
        </subscription>
</response>


als so ein Array
ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
array[response](
        status = OK
        session_id=v823z8
        expiretime=240000
        array[subscription](
                subHandler=VORXdj
                subExpireTime=60000
                array[statuslists](
                        array[statuslist](
                                uid=VIOe8v8Im0
                                array[status](
                                        name=POWER
                                        array[property](
                                                name=value
                                                value=false
                                      )
                                )
                        )
                )
        )
)


Nun ist das Problem, das wenn ich z.B. statuslists als neuen Array einfügen möchte,
ich ja nicht
ActionScript:
1_array[statuslists] = new Array();

schreiben kann, (das war der alte Fehler),
sondern die Hirachie des vorhandenen Arrays bis , in diesem Fall, subscription, haben müsste. Also
ActionScript:
1array[response][subscription][statuslists] = new Array();


Ich suche momentan die Möglichkeit die Struktur / Hirachie eines Arrays bis zu einem
bestimmten Punkt zwische zu speichern.

Tom
Irgenwas läuft immer schief!
Sebastian#4
Benutzerbild von SebastianFlashhilfe.de Moderator
Beiträge: 6981
Wohnort: München
Registriert: Jan 2002

11.08.2008, 11:02

Hm, du willst also anhand einer ID ein Element in Dein XML hinzufügen (oder im Array?)?
Was da natürlich schnell passieren kann ist das eine ID doppelt in anderen Levels vorkommt. Naja, aber ansonsten könnte das vielleicht etwas für Dich sein:
ActionScript:
1
2
3
4
5
6
7
var xml:XML =
        <menu>
            <item>burger</item>
            <item>soda</item>
        </menu>;
xml.insertChildAfter(xml.item[0], <saleItem>fries</saleItem>);
trace(xml);
JavaScript & JavaFX Freelancer || Flashhilfe @ Twitter || XING Profil
Werbung
Beiträge: 0
Registriert: Feb 2016


cttogo#5
Benutzerbild von cttogo
Beiträge: 313
Wohnort: Waltrop
Registriert: Jul 2008

Themenautor/in

11.08.2008, 11:17

Ich glaube ich sorge für Verwirrung. :-)

Ich möchte die xml Datei rekursiv in einen Array einlesen und anstatt eine nummerischen
Index, den Namen des Nodes verwenden.

Das geht in meine Funktion bis zur 2. Ebene.

ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function walkXML(node:XMLNode, depth:Number):Void {
  if (!depth) {
      var depth:Number = 0;
  }
  var len:Number = node.childNodes.length;
  for (var i:Number = 0; i < len; i++) {
      if (node.childNodes[i].parentNode.nodeName == null) {
        _array[node.childNodes[i].nodeName] = new Array();
      } else {
        if (node.childNodes[i].nodeType == 1) {
            _array[node.childNodes[i].parentNode.nodeName][node.childNodes[i].nodeName] = new Array();
        } else if (node.childNodes[i].nodeType == 3) {
            trace(node.childNodes[i].parentNode.nodeName + ' has the Value ' + node.childNodes[i].toString());
        }
      }
      if (node.childNodes[i].hasChildNodes) {
        walkXML(node.childNodes[i],depth + 1);
      }
  }
 
}


Der rot markierte Bereich funktioniert beim 2. Aufruf noch, da
ActionScript:
1_array[node.childNodes[i].parentNode.nodeName]

vorhanden ist.
Ab den 3. Aufruf müste es ja heissen
ActionScript:
1_array[node.childNodes[i].parentNode.parentNode.nodeName][node.childNodes[i].parentNode.nodeName]

Ab den 4.
ActionScript:
1_array[node.childNodes[i].parentNode.parentNode.parentNode.nodeName][node.childNodes[i].parentNode.parentNode.nodeName][node.childNodes[i].parentNode.nodeName]

usw.

Da ich momentan keine Lösung für das "dynamische Erweitern" der Parents habe, habe ich gehofft, das ich den Pfad vom 1. array bis zum letzten in der Struktur vorhandenen arary mit dem parentNode, zwischen speichern könnte.

Mir schwebte etws in der Art von "_array.parent1.parent2.parent3" as Array vor.

Was doppelte Nodes angeht, ist eine Überprüfung ob der Node schon vorhanden ist , schon da. Das funktioniert aber auch nur, wenn ich die richtige Struktur bis zu dem Node ansprechen kann.

Ich hoffe mein Problem ist jetzt klarer.

Tom
Irgenwas läuft immer schief!
Geändert von cttogo am 11.08.08 um 11:20 Uhr
omega psi#6
Benutzerbild von omega psi
Beiträge: 791
Registriert: Apr 2004

11.08.2008, 11:20

Arrays und Schlüssel beissen sich. Nimm stattdessen ein Object oder besser eine Klasse.
Architectures - Refactoring - Prototyping - Coding - Training
cttogo#7
Benutzerbild von cttogo
Beiträge: 313
Wohnort: Waltrop
Registriert: Jul 2008

Themenautor/in

11.08.2008, 11:23

Hallo omega psi,

auch wenn ich ein Objekt nehme, ändert es doch nichts an dem Problem die Struktur / Hirachie zwischen zu speichern oder Irre ich mich da.

Das Kernproblem bleibt doch das gleiche. Wie referenziere ich das letzte Array/Object mit allen seinen Parents/ OberObjekten?

Grüsse Tom
Irgenwas läuft immer schief!
Geändert von cttogo am 11.08.08 um 11:25 Uhr
omega psi#8
Benutzerbild von omega psi
Beiträge: 791
Registriert: Apr 2004

11.08.2008, 11:30

Sorry, hätte mehr auf meinen Gedankengang eingehen sollen: mappe die XML Struktur auf ein Objekt oder eben eine Klasse/Datenstruktur und schmeisse danach die XML weg.
Architectures - Refactoring - Prototyping - Coding - Training
cttogo#9
Benutzerbild von cttogo
Beiträge: 313
Wohnort: Waltrop
Registriert: Jul 2008

Themenautor/in

11.08.2008, 12:12

Hi omega psi,

ich scheine ein wenig auf dem Schlauch zu stehen.

Mit
ActionScript:
1var o:Object = new Object(wetObj.getXML());


scheint das Object o leer zu sein. Ein trace(wetObj.getXML()); gibt mir aber die xml Daten aus.

wetObj ist eine Klasse die die jahoo Weather api anspricht.
Irgenwas läuft immer schief!
cttogo#10
Benutzerbild von cttogo
Beiträge: 313
Wohnort: Waltrop
Registriert: Jul 2008

Themenautor/in

11.08.2008, 15:18

OK,

ich bin solangsam am Ziel meine Wünsche.

Ein Problemchen habe ich noch. Der Compiler schmeißt mir einen Fehler:

Keine Eigenschaft mit dem Namen '_attr' vorhanden.

ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function grepAttributes(xmln:XMLNode, obj:Object):Object {

      if (xmln.nodeType == 1) {
         trace('Action Type 1');
         for (_attr in xmln.attributes) {
            _key = _attr;
            _val = xmln.attributes[_attr];
            obj[_key] = _val;
         }
      
         if (xmln.firstChild.nodeType == 3) {
            this.grepAttributes(xmln.firstChild,obj);
         }
      } else {
         _key = 'inner';
         _val = xmln.toString();
         
         obj[_key] = _val;
      }
      
      return obj;
   }

Er mäckert die rote Teile an. var attr:*  in xmln.attributes geht auch nicht.
Was ist attr den jetzt?.

EDIT: Jetzt nimmt er var _attri:String ????. Manchmal denke ich der Comiler erkennt die Änderungen nicht.

Ich Poste gleich die Klasse.
THX
Tom
Irgenwas läuft immer schief!
Geändert von cttogo am 11.08.08 um 15:23 Uhr
Sebastian#11
Benutzerbild von SebastianFlashhilfe.de Moderator
Beiträge: 6981
Wohnort: München
Registriert: Jan 2002

11.08.2008, 15:23

var attr:* geht nicht weil _ fehlt. Ansonsten muss es aber funktionieren da * alles zulässt. Richtig ist an der Stelle allerdings String.
JavaScript & JavaFX Freelancer || Flashhilfe @ Twitter || XING Profil
Geändert von Sebastian am 11.08.08 um 15:25 Uhr
cttogo#12
Benutzerbild von cttogo
Beiträge: 313
Wohnort: Waltrop
Registriert: Jul 2008

Themenautor/in

11.08.2008, 15:24

Danke Sebastian habs gerade gemerkt.

Tom
Irgenwas läuft immer schief!
Sebastian#13
Benutzerbild von SebastianFlashhilfe.de Moderator
Beiträge: 6981
Wohnort: München
Registriert: Jan 2002

11.08.2008, 15:27

Gerne.

Wenn Deine Frage beantwortet ist, markier sie doch bitte als beantwortet.
JavaScript & JavaFX Freelancer || Flashhilfe @ Twitter || XING Profil
cttogo#14
Benutzerbild von cttogo
Beiträge: 313
Wohnort: Waltrop
Registriert: Jul 2008

Themenautor/in

11.08.2008, 15:29

Die Lösung:

ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
class XMLDataObject {
   private var _result:Object;
   private var _xml:XML;
   private var _path:Object;
   private var _XMLObject:XML;
   private var _key:String = '';
   private var _val:String = '';
   private static var xmldataobject:XMLDataObject;

   function XMLDataObject() {
      this._result = new Object();
   }
   public static function deserialize(xml:XML):Object {
      xmldataobject = new XMLDataObject();
      xmldataobject.xml = xml;
      return xmldataobject.nodesToProperties();
   }
   public function get xml():XML {
      return _xml;
   }
   public function set xml(xml:XML):Void {
      this._xml = xml;
   }
   private function sanitizeLineBreaks(raw:String) {
      if (raw.indexOf("\r\n") > -1) {
         return raw.split("\r\n").join("\n");
      }
      return raw;
   }
   private function nodesToProperties(parent:XMLNode, path:Object, name:String, position:Number):Object {
      var nodes:Array;
      var node:XMLNode;
      path == undefined ? path = this._result : path = path[name];
      if (parent == undefined) {
         parent = XMLNode(this._xml);
      }
      //trace("Parent: " + parent.nodeName);
      if (parent.hasChildNodes()) {
         nodes = parent.childNodes;
         if (position != undefined) {
            path = path[position];
         }
         while (nodes.length > 0) {
            node = XMLNode(nodes.shift());
            //trace("node: " + node.nodeName);
            if (node.nodeName != undefined) {
               var obj = new Object();
               //obj.attributes = node.attributes;
               obj = this.grepAttributes(node,obj);
               //obj[node.nodeName] = sanitizeLineBreaks(node.firstChild.nodeValue);

               if (path[node.nodeName] != undefined) {

                  if (path[node.nodeName].__proto__ == Array.prototype) {
                     path[node.nodeName].push(obj);
                  } else {
                     var copyObj = path[node.nodeName];
                     delete path[node.nodeName];
                     path[node.nodeName] = new Array();
                     path[node.nodeName].push(copyObj);
                     path[node.nodeName].push(obj);
                  }
                  position = path[node.nodeName].length - 1;
               } else {
                  path[node.nodeName] = obj;
                  position = undefined;
               }
               name = node.nodeName;
            }
            if (node.hasChildNodes()) {
               this.nodesToProperties(node,path,name,position);
            }
         }
      }
      return this._result;
   }
   function grepAttributes(xmln:XMLNode, obj:Object):Object {

      //trace("type: " + xmln.nodeType + " " + xmln.nodeName);

      if (xmln.nodeType == 1) {
         //trace('Action Type 1');
         for (var _attr:String in xmln.attributes) {
            trace(typeof(_attr));
            _key = _attr;
            _val = xmln.attributes[_attr];
            obj[_key] = _val;
            //trace(_key + " = " + _val);
         }
         //trace('Type firstNode: ' + xmln.firstChild.nodeType + " " + xmln.firstChild.nodeName);
         if (xmln.firstChild.nodeType == 3) {
            this.grepAttributes(xmln.firstChild,obj);
         }
      } else {
         //trace('Action Type 3');
         _key = 'inner';
         _val = xmln.toString();
         
         obj[_key] = _val;
      }
      
      return obj;
   }
}


aufzurufen mit:
ActionScript:
1
2
contentObj = XMLDataObject.deserialize(xml);
      this['timeline'].play();


macht aus:
ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0" encoding="UTF-8"?>
<response status="OK" sessionid="v823z8" expiretime="240000">
        <subscription subHandle="U0RXdJ" subExpireTime="60000">
                <statuslists>
                        <statuslist uid="VlOe8v8Im0">
                                <status name="POWER">
                                        <property name="value">false</property>
                                </status>
                        </statuslist>
                </statuslists>
        </subscription>
</response>


ein Object mit folgendem Inhalt:
ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
object[response](
    object[subscription](
        object[statuslists](
            object[statuslist](
                object[status](
                    object[property](
                        [string] inner=false
                        [string] name=value
                    )
                    [string] name=POWER
                )
                [string] uid=VlOe8v8Im0
            )
        )
        [string] subExpireTime=60000
        [string] subHandle=U0RXdJ
    )
    [string] expiretime=240000
    [string] sessionid=v823z8
    [string] status=OK
)


Die Angaben in den [] sind nur von der Ausbage heraus um den Typen anzuzeigen.

Danke an euch Beiden.

Die Klasse ist zwar zu 80% nicht auf meinem Mist gewachsen, aber ich habe zumindestens meine Anpassungen gemacht.

THX
Tom
Irgenwas läuft immer schief!

AntwortenRegistrieren Seite1  

Schnellantwort

Du musst registriert sein, um diese Funktion nutzen zu können.

 
Ähnliche Beiträge zum Thema
Partner Webseiten: art-and-law.de  Mediengestalter.info   php-resource.de   phpforum.de   phpwelt.de   Pixelio.de   Scubacube.de  
Haftungsausschluss   Datenschutzerklärung   Hier Werben   Impressum
© 1999-2020 Sebastian Wichmann - Flashhilfe.de