• beyond tellerrand – play. Register Now!
Zurück   Flashforum > Flash > ActionScript > ActionScript 3

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 25-01-2009, 13:34   #1 (permalink)
QuickScope
 
Benutzerbild von jaygroove
 
Registriert seit: May 2004
Ort: Upper Austria
Beiträge: 256
Question Im gesamten XML-Tree suchen

Hallo!

Zuerst einmal muss ich sagen, dass ich sehr positiv überrascht bin von den Neuerungen die E4X mit sich bringen. Sieht so aus, als könnte ich ab jetzt auf XPath verzichten Es gibt nur eine Sache, die ich bis jetzt noch nicht geschafft habe aber benötigen würde...

Folgende Situation: ich hab ein XML mit
<sitemap> <mainnavi> <subnavi id="#" /> </mainnavi> </sitemap>
usw...

ich brauche eine Methode, mit der ich eine XMLList mit allen subnavi elementen mit einer bestimmten id erstellen kann. Mein Ansatz funktioniert bereits, allerdings nur wenn ich den gesamten Tree angebe, also zb xmlData.sitemap.mannavi.elements() und dann mit if abfrage, ob das attribut übereinstimmt.

es gibt ja auch die Syntax xmlData..subnavi - so würde es funktionieren. doch ich brauche eine Möglichkeit, das 'subnavi' dynamisch durch _xmlNode zu ersetzen.

gibt es da eine möglichkeit? bei xpath ging das nämlich recht easy... danke für eure hilfe!!



PHP-Code:
public function getSpecificXMLNode 
_xmlNode String_attrib String_val String ) : XMLList
{
    
    var 
itemList XMLList xmlData.elements();
    var 
foundItems XML = <navigation/>;
    var 
specList XMLList = new XMLList();
    var 
itemCount uint itemList.length();
    
trace (itemCount " results found");

    for (var 
i:uint 0i<itemCounti++)
    {
        if (
itemList[i].attribute(_attrib) == _val
        {
            
foundItems foundItems.appendChilditemList[i] );    
        }
    }
    
    
specList foundItems.elements();
    
trace (specList);
    return 
specList
    

jaygroove ist offline   Mit Zitat antworten
Alt 25-01-2009, 14:47   #2 (permalink)
Nagelneuer User
 
Benutzerbild von hazy fantazy
 
Registriert seit: Dec 2005
Beiträge: 924
myXML..subnavi.(@id==123) liefert dir eine Liste mit allen subnavi Elementen, deren id Attribut den Wert 123 hat.
__________________
The fact that you've got "Replica" written on the side of your gun and the fact that I've got "Desert Eagle written on the side of mine ... :D
hazy fantazy ist offline   Mit Zitat antworten
Alt 25-01-2009, 15:11   #3 (permalink)
QuickScope
 
Benutzerbild von jaygroove
 
Registriert seit: May 2004
Ort: Upper Austria
Beiträge: 256
danke, aber das hilft mir in der situation nicht, denn:

var itemList : XMLList = xmlData.._xmlNode.(@_attrib==_val);

funktioniert nicht.. gibts ne möglichkeit, das abgefragte attribut sowie den target node dynamisch einzusetzen, da _xmlNode, _attrib und _val ja parameter der methode sind...

ich würd da gern ne universelle methode draus machen, sofern es möglich ist...

Geändert von jaygroove (25-01-2009 um 15:12 Uhr)
jaygroove ist offline   Mit Zitat antworten
Alt 25-01-2009, 15:22   #4 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 11.856
So als fixes Beispiel:
ActionScript:
  1. package {
  2.  
  3.     import flash.display.Sprite;
  4.  
  5.     public class E4XExample extends Sprite
  6.     {
  7.  
  8.         private var _xml:XML =  <root>
  9.                                     <nodes>
  10.                                         <node id="001" label="Node 1" />
  11.                                         <node id="002" label="Node 1" />
  12.                                         <node id="003" label="Node 3" />
  13.                                     </nodes>
  14.                                 </root>
  15.  
  16.         public function E4XExample()
  17.         {
  18.             super();
  19.             trace(getItemByLabel(_xml, "node", "Node 1"));
  20.         }
  21.  
  22.         public function getItemByLabel(xml:XML, nodeName:String, label:String):XMLList
  23.         {
  24.             return xml.children().child(nodeName).(@label==label);
  25.         }
  26.     }
  27. }
Omega Psi ist offline   Mit Zitat antworten
Alt 25-01-2009, 16:19   #5 (permalink)
QuickScope
 
Benutzerbild von jaygroove
 
Registriert seit: May 2004
Ort: Upper Austria
Beiträge: 256
Thumbs up

danke Omega!

dein Beispiel funktioniert soweit, allerdings wenn das XML so modifiziert ist:

PHP-Code:
private var _xml:XML =  <root>
                              <
nodes>
                                  <
node id="001" label="Node 1" />
                                  <
node id="002" label="Node 1">
                                      <
node id="004" label="Subnode" />
                                      <
node id="005" label="Subnode" />
                                  </
node>
                                  <
node id="003" label="Node 3" />
                              </
nodes>
                          </
root
dann kann man zB nicht nach Node 3 oder Subnode suchen.

Weiters, wäre es super, wenn man den Attribut Namen auch dynamisch verwenden kann, folgender Code funktioniert nicht:

PHP-Code:
    public function E4XXample() 
    {
          
super();
          
trace(getItemByLabel(_xml"node""label""Node 1"));

    }

    public function 
getItemByLabel
    
(xml:XMLnodeName:Stringattribute:Stringlabel:String):XMLList
    
{

        return 
xml.children().child(nodeName).(@attribute==label);

    } 
jaygroove ist offline   Mit Zitat antworten
Alt 25-01-2009, 16:34   #6 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 11.856
So in etwa?
ActionScript:
  1. package {
  2.  
  3.     import flash.display.Sprite;
  4.  
  5.     public class E4XExample extends Sprite
  6.     {
  7.  
  8.         private var _xml:XML =  <root>
  9.                                     <nodes id="1">
  10.                                         <node id="2" label="Node 1" />
  11.                                         <node id="3" label="Node 1" />
  12.                                         <node id="4" label="Node 1">
  13.                                             <node id="6" label="Node 1" />
  14.                                         </node>
  15.                                         <leave id="5">
  16.                                             <node id="7" label="Node 1" />
  17.                                         </leave>
  18.                                     </nodes>
  19.                                 </root>
  20.  
  21.         public function E4XExample()
  22.         {
  23.             super();
  24.             trace(getItemByLabel(_xml, "node", "label", "Node 1").
  25.                     toXMLString());
  26.         }
  27.  
  28.         public function getItemByLabel(xml:XML, nodeName:String,
  29.                 attribute:String, value:String):XMLList
  30.         {
  31.             return xml..*.child(nodeName).(@[attribute]==value);
  32.         }
  33.     }
  34. }
Omega Psi ist offline   Mit Zitat antworten
Alt 25-01-2009, 16:46   #7 (permalink)
QuickScope
 
Benutzerbild von jaygroove
 
Registriert seit: May 2004
Ort: Upper Austria
Beiträge: 256
aaah, da gibt es auch einen * platzhalter sowie die [] Syntax.. sehr cool - danke!

heisst das jetzt, dass eine XMLList quasi fix mehrere Elemente enthalten muss, ansonsten ist sie leer?
jaygroove ist offline   Mit Zitat antworten
Alt 25-01-2009, 16:47   #8 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 11.856
Was meinst du mit fix?
Omega Psi ist offline   Mit Zitat antworten
Alt 25-01-2009, 17:37   #9 (permalink)
QuickScope
 
Benutzerbild von jaygroove
 
Registriert seit: May 2004
Ort: Upper Austria
Beiträge: 256
Naja es ist so:

wenn ich .toXMLString() verwende, dann sieht man auch Listen mit nur einem Element bei einem trace. Allerdings ist es ja dann wirklich ein String und ich kann auf diesen dann keine XML Eigenschaften ansprechen. Inzwischen bin ich draufgekommen, dass ein trace auf eine XMLListe nur dann etwas anzeigt, wenn mehr wie ein Element vorhanden ist oder zumindest Unterknoten da sind. Aber die Eigenschaften einer XMLList mit nur einem Element sind trotzdem ansprechbar.

Hab ich das soweit richtig verstanden? Ich denke es sollte kein Problem in der Verwendung darstellen, wenn man das bedenkt...
jaygroove ist offline   Mit Zitat antworten
Alt 25-01-2009, 18:09   #10 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 11.856
Eine XMLList ist in etwa wie ein Array für XML zu betrachten. Wenn natürlich keine Elemente enthalten sind, macht auch eine String-Representation keinen Sinn -> steht ja nichts drin.
Omega Psi ist offline   Mit Zitat antworten
Alt 25-01-2009, 18:15   #11 (permalink)
QuickScope
 
Benutzerbild von jaygroove
 
Registriert seit: May 2004
Ort: Upper Austria
Beiträge: 256
ok - danke vielmals für deine hilfe!
jetzt bin ich mit meinem 200. post wieder um einiges klüger geworden
jaygroove 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 22:22 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele