アシアルブログ

アシアルの中の人が技術と想いのたけをつづるブログです

【Flex】Flexのコーディング規約のお話

こんにちは、橋本です。

今日はFlexのコーディング規約についてお話しようと思います。

「え、Flexにコーディング規約なんてあったの!?」

とお思いの方も多いかと思いますが、実は公式のコーディング規約が存在します。

Flex SDK coding conventions and best practices

日本語訳はこちら


今日はこの中で個人的に気になったところを拾って見ていきたいと思います。


略語


原則は、略語を使用しないということになっていますが、一部標準化されている略語があります。

acc: accessibility(アクセシビリティ)。使用例: ButtonAccImpl
auto: automatic(自動)。使用例: autoLayout
eval: evaluate(評価)。使用例: EvalBindingResponder
impl: implementation(実装)。使用例: ButtonAccImpl
info: information(情報)。使用例: GridRowInfo
num: number(数値)。使用例: numChildren
min: minimum(最小)。使用例: minWidth
max: maximum(最大)。使用例: maxHeight
nav: navigation(ナビゲーション)。使用例: NavBar
regexp: regular expression(正規表現)。使用例: RegExpValidator
util: utility(ユーティリティ)。使用例: StringUtil


個人的には、obj(object)、arr(array)、str(string)なんかも標準に入れても良い気がするのですが。

プロパティ名(変数およびgetter/setter)


小文字で綴りを開始し、以後の連語をキャメルケース方式で記述します。例: i、width、numChildren。

ループのインデックスにはi、上限値にはnをそれぞれ使用します。 内部ループのインデックスにはj、上限値にはmをそれぞれ使用します。

for (var i:int = 0; i < n; i++)
{
    for (var j:int = 0; j < m; j++)
    {
        ...
    }
}

for-inループの変数には、p(プロパティの頭文字)を使用します。

for (var p:String in o)
{
    ...
}



for文に関しては、特に異論はないのですが、for-in文の規約には個人的に納得出来ないというか、微妙な気がします。

pってわかりにくいですよね?

for-in文の中でさらにfor-in文を使うときにはどうするんでしょうか?pをプロパティの頭文字と言うのであれば、qだとおかしいですよね?だとすると、p2?

微妙ですね。。。


ストレージ変数名



getter/setterのfooのストレージ変数には、_fooという名前を付けます。



これも、好き嫌いがあると思います。個人的には、内部プロパティについては、全て_hogehogeといった感じで、アンダーバーからスタートする変数名に統一するのが、意外と分かりやすくていいんじゃないかな、と。

イベントハンドラ


イベントハンドラには、イベントの種類を示す語句に「Handler」を結合した名前を付けます。例: mouseDownHandler()。

仮にハンドラが、サブコンポーネント(this}}以外のものなど)によってディスパッチされるイベント用のものである場合は、ハンドラ名の前にサブコンポーネント名を付け、これらをアンダースコアで結合します。例: textInput_focusInHandler()。


イベントハンドラについては、onを接頭詞として付ける派(onMouseDown、など)の方もいらっしゃるかと思いますが、FlashBuilder4から追加された、イベントハンドラを自動で作成してくれる機能では、上記の規約に従ってメソッドが作成されるので、こちらに移行した方がいろいろと楽かもしれません。

引数名


各setterの引数には、valueを使用します。

public function set label(value:String):void

各イベントハンドラの引数には、(e、evt、eventObjではなく)eventを使用します。

protected function mouseDownHandler(event:Event):void


個人的には、setterの引数には、setする引数名を使いたくなるんですが。。



private var _hoge:String;
			
public function set hoge(hoge:String):void
{
   _hoge = hoge;
}


どっちがわかりやすいんでしょうか。

型宣言


すべての定数、変数、関数引数、関数の戻り値に対して、型宣言を記述します。
Arrayデータ型を宣言する場合は、/* of ElementType */の体裁のコメントをArray直後に記述し、配列要素の型を示すようにします。 将来バージョンの言語では、型付けされた配列が含まれる見込みです。


これは、めんどくさいんですが、慣れるとコードが読みやすくていいかもしれません。
こんな感じです。




var arr:Array /* of String */ = [];



また、この規約はFlash10以降使えるようになった、Vectorクラスの記述に似せたものなのかもしれません。
Vectorクラスは配列みたいなものなのですが、中に格納するデータの型を指定する必要があります。




private var vector:Vector.<String>;



リテラル


String:
文字列の区切りとしては、たとえその文字列にクオーテーションマークが文字として含まれている場合でも、アポストロフィ(1重引用符)ではなくクオーテーションマーク(2重引用符)を使用します。

"What's up, \"Big Boy\"?";

Array:
new Array()ではなく、配列リテラルを使用する。

var arr:Array = [];

Object:
new Object()ではなく、Objectリテラルを使用する。

var obj:Object= {};



ArrayとObjectは基本かと思いますが、Stringが気持ち悪いですね。わざわざエスケープするくらいなら、シングルクォート使う方がわかりやすいと思うんですけどね。。

ifステートメント


if/elseステートメントの分岐後条件に単一のステートメントのみが含まれる場合は、これらをブロックにすることを避けます。
1.
if (flag)
    doThing1();

2.  
if (flag)
    doThing1();
else
    doThing2():



1番はまぁいいのですが、2番はブロックにしたいですよね。なんとなく気持ち悪い。。。

forステートメント


たとえステートメントが1つしかない場合でも、{{for}}ループの命令部分はブロックで記述します。
for (var i:int = 0; i < 3; i++)
{
   doSomething(i);
}


なんで、ifと逆なんだ…。

switchステートメント


各case句の内容、およびdefault句の内容はブロックで記述します。breakステートメントおよびreturnステートメントは、ブロックの後ではなくブロック内に記述します。 returnがある場合は、returnをbreakの後に配置しないようにします。 default句はcase句同様に扱うようにし、breakやreturnを記述してswitchの最後まで処理が達するのを防ぐようにします。

switch (n)
{
    case 0:
    {
        foo();
        break;
    }

    case 1:
    {
        bar();
        return;
    }

    case 2:
    {
        baz();
        return;
    }

    default:
    {
        blech();
        break;
    }
}


これは慣れると、非常に見やすいです。

PHPを書いてるときにも、switch文の書き方に違和感を感じていたので、この書き方は目から鱗でした。
ちなみに、PHPでもこの書き方、できます。

ローカル変数


ローカル変数は、その変数が初めて使用される時点、または使用される直前に宣言するようにします。 すべての宣言を関数の最初の部分に記述することは避けます。

正しい記述例
private function f(i:int, j:int):int
{
    var a:int = g(i - 1) + g(i + 1);
    var b:int = g(a - 1) + g(a + 1);
    var c:int  = g(b - 1) + g(b + 1);

    return (a * b * c) / (a + b + c);
}

誤った記述例
private function f(i:int, j:int):int
{
    var a:int;
    var b:int;
    var c:int;

    a = g(i - 1) + g(i + 1);
    b = g(a - 1) + g(a + 1);
    c = g(b - 1) + g(b + 1);

    return (a * b * c) / (a + b + c);
}


AS3はブロック内のみが有効範囲のローカル変数に対応しておらず、変数名の重複でコンパイルエラーが出るときが多々あるので、個人的には、最初にまとめて宣言しちゃいたいです。

まぁ、変数名にもっと気を使ってコード書けって話になるのかもしれませんが。

記述書式


コードは1行あたり半角文字80字で折り返します。 これにより以下のメリットを享受できます。

デベロッパーが小さな画面を使用している場合でも、長い行を読む際に水平にスクロールする必要がありません。
比較ユーティリティを使用する際、ファイルの2つのバージョンを並べて表示できます。
プロジェクタを使用してグループにプレゼンする際、スクロールではなくフォントサイズを大きくすることで対応できます。
途切れや無駄な改行なく、ソースコードを印刷できます。


一行あたり80文字は少なくないですか。
下手したら、メソッドの宣言だけで80文字こえちゃいますよ?
メリットは確かにあるのかもしれませんが、普段コードを書く分には80文字だと少し物足りないですよね。


インデント



半角スペース4文字のインデントを使用します。



PHPを書くときは、半角2文字派だったんですが、慣れると4文字の方が見やすいです。

その他にもいろいろとあるのですが、個人的に気になったのはこの辺でしょうか。
コーディングスタイルは人それぞれだと思いますので、そんなに気にすることもないのかもしれませんが、
時間があれば一度目を通してみると、いろいろと発見があって面白いかもしれません。

【Flex3】「Flex3の、こんなときどうするの??」

こんにちは、最近モールス信号に興味深々の橋本です。

さて、今回は前回の「AS3のこんなときどうするの?」の続編で、

Flex3のこんなときどうする?」をテーマに、また思いついたところを適当に書いていきたいと思います。

アサインされてるプロジェクトを進める中で発見したものばかりなので、結構偏りがあるかもしれませんが、そこはご了承くださいませ。。。

では、どぞー。

1. スクリプトの中で値をバインドしたい

Q. mxmlの中で値をバインドするときには、バインドしたい変数をmxmlの中で{}で囲み、対象の変数に、[Bindable]タグをつければオッケーなんだけど、スクリプトの中で、値をバインドさせたいときはどうするの??

A. BindingUtilsクラスを使いましょう。
BindingUtils.bindProperty()を使うことで、プロパティ同士をバインドさせることができます。



var textInput:TextInput = new TextInput();
addChild(textInput);
				
var label:Label = new Label();
addChild(label);

BindingUtils.bindProperty(label, "text", textInput, "text");


bindSetterメソッドを使うことで、対象の変数が変化したときに、特定のメソッドを呼び出すこともできますよ。



<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" minWidth="1024" minHeight="768"
				creationComplete="application1_creationCompleteHandler(event)"
				>
	<mx:TextInput id="textInput"/>
	<mx:Label id="hoge"/>
	<mx:Script>
		<![CDATA[
			import mx.binding.utils.BindingUtils;
			import mx.controls.Label;
			import mx.controls.TextInput;
			import mx.events.FlexEvent;
			

			protected function application1_creationCompleteHandler(event:FlexEvent):void
			{
				BindingUtils.bindSetter(toUpperCase, this.textInput, "text");
			}
			
			private function toUpperCase(str:String):void
			{
				this.hoge.text = str.toUpperCase();
			}
		]]>
	</mx:Script>
</mx:Application>


2. 自分で作ったクラスのプロパティをバインドの対象にしたい

Q. 自分で作成したクラス内のプロパティをバインドの対象にしたい。でも、呼び出し元で[Bindable]タグをつけるわけにもいかないし、BindingUtils使おうと思っても、対象外って怒られるし、どうするの??

A. 自分で作成したクラス内の変数のセッター内で、イベントをdispatch。Bindableタグの中で、そのイベントを指定するとバインドの対象にできますよ。
こんな感じです。



var hoge:String;

//セッターの中で、設定したイベントをdispatch。Bindableタグで、イベントを指定
[Bindable(event="hogeChange")] 
public function set hoge(value:String):void
{
	dispatchEvent(new Event("hogeChange"));
	hoge = value; 
}


3. 独自イベントをmxmlの選択項目にいれたい

Q. 自分でカスタムしたコンポーネントを呼び出すときに、独自イベントをmxmlで指定したいんだけど、どうするの??

A. コンポーネント内のMetadataタグの中にイベント名を記載しておきましょう。そうすることで、後からmxml上で使うことができます。



<mx:Metadata>
	[Event(name="hoge",type="flash.events.Event")]
</mx:Metadata>


4. DataGridの背景色を変更したい

Q. DataGridの背景色をセル毎に変えたいんだけど、どうするの??

A. DataGridColumnのitemRendererのbackgroundプロパティをtrueにして、backgroundColorを設定することで変更できますよー。



<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" minWidth="1024" minHeight="768"
				xmlns:components="components.*"
				creationComplete="application1_creationCompleteHandler(event)"
				>
	<mx:DataGrid dataProvider="{dataList}"
				 width="100%"
				 height="100%"
				 >
		<mx:columns>
			<mx:DataGridColumn headerText="hoge" dataField="data" itemRenderer="components.Hoge"/>
		</mx:columns>
	</mx:DataGrid>
	<mx:Script>
		<![CDATA[
			import mx.collections.ArrayCollection;
			import mx.events.FlexEvent;

			[Bindable]
			private var dataList:ArrayCollection;
			
			protected function application1_creationCompleteHandler(event:FlexEvent):void
			{
				var arr:ArrayCollection = new ArrayCollection();
				for (var i:int = 0; i < 100; i++)
				{
					var obj:Object =
						{
							data: i
						}
					;
					
					arr.addItem(obj);
				}
				
				dataList = arr;
			}

		]]>
	</mx:Script>
</mx:Application>


itemRenderer用のクラス


package components
{
	import mx.controls.dataGridClasses.DataGridItemRenderer;
	
	public class Hoge extends DataGridItemRenderer
	{
		
		public function Hoge()
		{
			super();
			
			this.background = true;
			// ランダムの色を入れる
			this.backgroundColor = Math.random() * 0xFFFFFF;
		}
	}
}


5. DataGridに文字列以外のものを表示したい

Q. DataGridに、ボタンとか画像とかチェックボックスとか、その他諸々を表示したいんだけど、どうするの??

A. DataGridColumnのitemRendererに、表示したいコンポーネントのクラスを指定することで変更することができますよー。
mxmlで指定するときには、一つ前のサンプルの中でやっているような感じで、クラス名を指定してやればオッケーです。
スクリプトで指定するときには、ClassFactoryクラスのインスタンスを指定してやればオッケーです。



var column:DataGridColumn = new DataGridColumn();
column.itemRenderer = new ClassFactory(Hoge);


6. ツリーに文字列以外のものを表示したい

Q. ツリーにボタンとか画像とかチェックボックスとか、その他諸々を表示したいんだけど、どうするの??

A. DataGridのときと同様に、itemRendererを指定することで可能です。
ただ、チェックボックスを表示するときは要注意。DataGridやTreeなどの、ListベースのコンポーネントのitemRendererは内部で使いまわされるので、チェックした状態を保持しておく機構が必要です。

以下の例では、TreeのdataProviderに指定しているXMLに、selectedというAttributeを持たせて、それを変更することによって、チェック状態を保持しています。



<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" minWidth="1024" minHeight="768"
				xmlns:components="components.*"
				>
	<mx:Tree itemRenderer="components.Hoge" dataProvider="{xml}" width="100" labelField="@value"/>
	<mx:Script>
		<![CDATA[
			[Bindable]
			private var xml:XMLList = XML(
				<root>
					<node selected="false" value="1"/>
					<node selected="false" value="2"/>
					<node selected="false" value="3"/>
					<node selected="false" value="4"/>
					<node selected="false" value="5"/>
					<node selected="false" value="6"/>
					<node selected="false" value="7"/>
					<node selected="false" value="8"/>
					<node selected="false" value="9"/>
					<node selected="false" value="10"/>
				</root>
			).node;
		]]>
	</mx:Script>
</mx:Application>


チェックボックスを表示するためのカスタムitemRendererクラス


package components
{
	import mx.binding.utils.BindingUtils;
	import mx.controls.CheckBox;
	import mx.controls.treeClasses.TreeItemRenderer;
	import mx.controls.treeClasses.TreeListData;
	
	public class Hoge extends TreeItemRenderer
	{
		[Bindable]
		public var checkBox:CheckBox;
		
		public function Hoge()
		{
			super();
		}
		
		override public function set data(value:Object):void {
			super.data = value;
		}
		
		override protected function createChildren():void{
			super.createChildren();
			
			checkBox = new CheckBox();
			checkBox.setStyle("verticalAlign","middle");
			BindingUtils.bindSetter(setSelected, checkBox, 'selected');
			this.addChild(checkBox);
		}
		
		override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void {     
			var treeListData:TreeListData = TreeListData(super.listData);
			
			super.updateDisplayList(unscaledWidth,unscaledHeight);
			
			if(super.data)
			{
				if (data.@selected.toString() == 'true')
				{
					checkBox.selected = true;
				}
				else
				{
					checkBox.selected = false;
				}
				
				checkBox.x = super.label.x;
				checkBox.y = ( unscaledHeight - checkBox.height ) /2;
				label.x = checkBox.x + checkBox.width + 20;
			}
		}
		
		private function setSelected(selected:Boolean):void
		{
			if (data)
			{
				data.@selected = selected.toString();
			}
		}
	}
}


7. drag and drop時の画像を変更したい

Q. drag and dropを独自に実装したときに、ドラッグする対象の画像を変更したいんだけど、どうするの??

A. DragManagerクラスのdoDragメソッドの第四引数に画像を指定してやればオッケーです。



DragManager.doDrag(dragInitiator, dragSource, event, img);


8. カーソルを変更したい

Q. 処理待ち中のカーソルを変更したりしたいんだけど、どうするの??

A. cursorManager変数の各種メソッドを使えば可能ですよー。

cursorManager.setBusyCursor()で、デフォルトの時計のアイコンを表示することができます。
cursorManager.removeBusyCursor()で、普通のアイコンに戻せます。

CursorManager.setCursor()を使うことで、独自のアイコンを指定することもできますよー。

9. ラッパーのhtmlのtitleをswfの中で設定したい

Q. htmlのタイトルを変更したいんだけど、どうするの??

A. ExternalInterfaceクラスを使いましょう。そうすることで、swfから、javascriptを実行することができます。



ExternalInterface.call("function(){if(location.href.indexOf('#',0) != -1){document.title = 'hogehoge'}}");


ラッパーhtmlの中でタイトルを最初から指定しておけばいいんじゃネーノ?って思うかもしれませんが、IEだけちゃんと動かないんですよ。なぜか'#'って表示されちゃうんですよね。

10. swfの置いてあるURLを取得したい

Q. swfの実行元のURLを取得して、swfの内部で使いたいんだけど、どうするの??

A. Application.application.urlで、実行されているswfのURLをフルで取得できるので、そこから正規表現で取得しましょう。



private function getHost():String
{
	var fullUrl:String = Application.application.url;
	var reg:RegExp = new RegExp("http://[^/]*/");
	if (reg.test(fullUrl)) {
		return reg.exec(fullUrl).toString();
	}
}


以上でーす。

結構偏った内容なんですが、お役にたてることが一つでもあれば幸いです。
ではではー。

【AS3】「ActionScript3の、こんなときどうするの??」

こんにちは、橋本です。
今日は、自分が普段AS3を書いていて「こんなときどうするの??」と思ったところを中心にいくつか書いみました。
思いついたものから書いていったので、内容はバラバラですが、お役に立てる内容が一つでもあれば幸いです。

では、どうぞー。


Q. イベントリスナーに引数を渡したい。

A. 関数を返すイベントハンドラを指定することで、引数を渡すことができます。

サンプル.


// イベントリスナを登録するときに、引数を渡す
addEventListener(MouseEvent.CLICK, clickHandler("hoge"));

private function clickHandler(str:String):Function
{
	return function (event:MouseEvent):void {trace(str)};
}


Q. イベントの進行を止めたい。

A. event.stopPropagation()を使います。現在処理されている対象で、イベントの伝達をストップすることができます。

サンプル.


public class test extends Sprite
{
	public function test()
	{
		var obj:Object = {hoge: "hoge"};
		
		var sprite:Sprite = new Sprite();
		sprite.name = "parent";
		this.addChild(sprite);
		sprite.graphics.beginFill(0xFFFF00);
		sprite.graphics.drawRect(0, 0, 100, 100);
		
		sprite.addEventListener(MouseEvent.CLICK, clickHandler1);
		
		var sprite2:Sprite = new Sprite();
		sprite2.name = "child";
		sprite.addChild(sprite2);
		sprite2.graphics.beginFill(0x00FF00);
		sprite2.graphics.drawRect(0, 0, 50, 50);
		
		sprite2.addEventListener(MouseEvent.CLICK, clickHandler2);
	}
	
	private function clickHandler1(event:MouseEvent):void
	{
		trace("parent");
	}
		
	private function clickHandler2(event:MouseEvent):void
	{
		trace("child")
		
		event.stopPropagation();
	}
}


Q. イベントの、currentTargetとtargetの違いが、実はよくわかりません。

A. 大丈夫です。僕は最初はよくわかっていませんでしたw
currentTargetは、イベントを受け取ったオブジェクトで、targetはイベントを発生させたオブジェクトです。
以下のサンプルで、親のボックスをクリックしたときには、両方とも"parent"と表示されますが、子のボックスをクリックしたときには、targetが"child"となり、currentTargetが"parent"となります。これは、子のボックスをクリックしたことで発生したイベントを、親のボックスで受け取っているからです。

サンプル.


public class test extends Sprite
{
	public function test()
	{
		var obj:Object = {hoge: "hoge"};
		
		var sprite:Sprite = new Sprite();
		sprite.name = "parent";
		this.addChild(sprite);
		sprite.graphics.beginFill(0xFFFF00);
		sprite.graphics.drawRect(0, 0, 100, 100);
		
		sprite.addEventListener(MouseEvent.CLICK, clickHandler1);
		
		var sprite2:Sprite = new Sprite();
		sprite2.name = "child";
		sprite.addChild(sprite2);
		sprite2.graphics.beginFill(0x00FF00);
		sprite2.graphics.drawRect(0, 0, 50, 50);
	}
	
	private function clickHandler1(event:MouseEvent):void
	{
		trace("currentTarget:" + event.currentTarget.name + ", target:" + event.target.name);
	}
}


Q. オブジェクトのクラス名を知りたい。

A. flash.utils.getQualifiedClassNameメソッドを使うと、フルパスのクラス名を取得できます。純粋にクラス名だけを取りたいときには正規表現を使ったりしてみてくだしい。

サンプル.


var sprite:Sprite = new Sprite();

trace(getQualifiedClassName(sprite)); // flash.display::Sprite
trace(getQualifiedClassName(sprite).match(/::(.*)/)[1]); // Sprite


Q. 配列にオブジェクトが含まれているか知りたい(PHPでいうところの、in_array)。

A. indexOfメソッドを使います。配列に含まれている場合には、インデックスを返し、無い場合には"-1"を返してくれるので、そこで判定します。

サンプル.


public static function inArray(item:*, arr:Array):Boolean
{
	return arr.indexOf(item) != -1;
}


Q. 配列のコピーが欲しい。

A. Arrayの中身をfor文で回して…というのは嘘で、Array.concat()もしくは、Array.slice()を引数無しで呼び出すことで作成可能です。

サンプル.


var arr:Array = [1, 2, 3];

var arr2:Array = arr.concat();

for each (var num:Number in arr2)
{
	trace(num);
}


Q. オブジェクトディープコピーが欲しい。

A. ByteArrayクラスのインスタンスを作成することでディープコピーが可能になるようです。(参考:http://help.adobe.com/ja_JP/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7ee7.html)リンク先にもありますが、一応cloneメソッドのサンプルを載せておきます。

サンプル.


import flash.utils.ByteArray; 
 
function clone(source:Object):* 
{ 
    var myBA:ByteArray = new ByteArray(); 
    myBA.writeObject(source); 
    myBA.position = 0; 
    return(myBA.readObject()); 
}


どうでしょうか。
お役に立てることがひとつでもあれば幸いです。

E4Xのまとめ-その2-

こんにちは。Flex大好き橋本です。

今回は、前回の「E4Xのまとめ-その1-」の続きということで、子孫ノードへのアクセス、値のフィルタリング、名前空間の利用についてまとめていきたいと思います。

・子孫ノードへのアクセス。
「..」を使って、子孫ノードにアクセスすることができます。



//例
var xml:XML = <root>
	<hoge>hoge1</hoge>
	<fuga>
		<hoge>hoge2</hoge>	
	</fuga>
</root>;

//前回あったとおり、「.」を使うと、直接の子ノードを取得することができます。
var a:XMLList = xml.hoge;
for each (var b:XML in a) {
	trace(b); //hoge1
} 

//「..」を使うと、「.」とは異なり、直接の子ノードだけではなく、すべての子孫ノードを取得することができます。
var a:XMLList = xml..hoge;
for each (var b:XML in a) {
	trace(b); //hoge1, hoge2
} 


・条件指定によるフィルタリング
「()」の中に条件を指定することによって、各ノードの値や属性値について、フィルタリングを行うことができます。



//例
var xml:XML = 
    <root>
        <member id="1">
            <name>akifumi</name>
            <job>engineer</job>
        </member>
        <member id="2">
            <name>tarou</name>
            <job>analyst</job>
        </member>
    </root>;

// ノードの値でフィルタリング
trace(xml.member.(name == "akifumi")); // 一つめの<member>ノードを取得

// 属性値でフィルタリング
trace(xml.member.(@id == 2)); // 二つめの<member>ノードを取得
trace(xml.member.(@id <= 1)); //不等号を使うことも可能。この場合は、一つめの<member>ノードを取得

// 正規表現によるマッチングを利用することもできます。
var regexp:RegExp = new RegExp("engineer");
trace(xml.member.(job.toString().match(regexp) != null)); //一つめの<job>ノードを取得


名前空間が指定されている値の取得
Namespaceクラスを利用することで、名前空間が指定されているXMLの値を取得することが可能です。
//例
var xml:XML =
aaaa
bbbb
;

// namespaceを指定して値を取得
var ns:Namespace = new namespace("http://hogehoge.hoge");
trace(xml.name); // aaaa
trace(xml.ns::name); // bbbb
<
default xml namespace ディレクティブを利用することで、デフォルトのnamespaceを指定することもできます。



var xml:XML = <root xmlns:hoge="http://hogehoge.hoge" xmlns:fuga="http://fugafuga.fuga">
	<fuga:name>aaaa</fuga:name>
	<hoge:name>bbbb</hoge:name>
</root>;

// デフォルトnamespaceを設定
var ns1:Namespace = new Namespace("http://hogehoge.hoge");
default xml namespace = ns1;

trace(xml.name); // bbbb

// デフォルトnamespaceを切り替え
var ns2:Namespace = new Namespace("http://fugafuga.fuga");
default xml namespace = ns2;

trace(xml.name); // aaaa


以上、前回と今回の2回に渡って、簡単ですがAS3におけるE4Xの使い方をまとめてみました。
特に、フィルタリングの部分はうまく使うことで、非常に簡単に目的の値を取得することが可能になるかと思いますので、尻込みせずに、ぜひ使ってみていただけたらと思います。