Recipe 20.7. Finding Elements by Name


Problem

You want to find an element by its node name rather than by its position in the XML hierarchy.

Solution

Use E4X syntax to "dot down" to a particular element.

Discussion

E4X makes working with XML objects as simple as working with regular objects. For each element node, you access that element in the same way you access the property of an object; for example:

var fruit:XML = <fruit><name>Apple</name></fruit>; // Displays: Apple trace( fruit.name );

As you can see here, to access the name element in the XML packet, use the dot operator (.) and reference name directly of the fruit XML instance. For elements nested deeper in the XML tree, use a series of dots and element names to reach the element, as follows:

var author:XML = <author><name><firstName>Darron</firstName></name></author>; // Displays: Darron trace( author.name.firstName );

One shortcut to consider for accessing deeply nested element nodes without knowing the path to get to the node is to use the double-dot operator. For example, you can omit the path and extract the firstName node directly, like this:

var author:XML = <author><name><firstName>Darron</firstName></name></author>; // Displays: Darron trace( author..firstName );

The double-dot operator works for any level of nesting; it doesn't matter if the target node is two or ten levels deep.

When there are multiple element nodes that share the same name, accessing the element name from an XML instance becomes indexable, much like an Array. Use bracket notation, coupled with an integer, to access a particular element node; for example:

var items:XML = <items>                   <item>                     <name>Apple</name>                     <color>red</color>                   </item>                   <item>                     <name>Orange</name>                     <color>orange</color>                   </item>                 </items>;                  // Displays: Apple trace( items.item[0].name ); // Displays: Orange trace( items.item[1].name );

Using items.item returns an XMLList with two elements, each representing one of the item element nodes in the XML literal. The first item element node can be accessed by examining index 0, and the second item element node is accessed with index 1. The first element index is always 0, and the last element index is always one less than the total number of elements. Use the length( ) method to count the number of elements found:

// Displays: 2 trace( items.item.length(  ) );

If you want to examine every element node with a particular node name and you don't know how many there are, use a for each loop, like this:

var items:XML = <items>                   <item>                     <name>Apple</name>                     <color>red</color>                   </item>                   <item>                     <name>Orange</name>                     <color>orange</color>                   </item>                 </items>; // Use the double dot syntax so we can omit the path for each ( var name:XML in items..name ) {   /* Displays:   Apple   Orange   */   trace( name );     }

As with other applications of the dot operator, you can use bracket notation instead of the dot operator. This is useful for situations in which you want to use a variable's value as the element name to find:

var nodeName:String = "color"; var fruit:XML = <fruit><color>red</color></fruit>; // Displays: red trace( fruit[nodeName] );

Bracket notation cannot be used with the double-dot operator. For example, the following code generates an error:

trace( fruit..[nodeName] ); // Generates a compile error

See Also

Recipe 20.14




ActionScript 3. 0 Cookbook
ActionScript 3.0 Cookbook: Solutions for Flash Platform and Flex Application Developers
ISBN: 0596526954
EAN: 2147483647
Year: 2007
Pages: 351

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net