home > 投稿 > E4Xでリーフノードから選別するには
2007/04/24

E4Xでリーフノードから選別するには


E4Xでは、選別述語演算子を使ってXMLListの一部を手軽に抜き出せます。 この時、子のテキストノードの値で判断するのが典型的なのですが、 そのノード自身の値で判断するときはどう書けばいいのでしょうか。一瞬詰まったのでメモです。

典型的な例です。

var employees:XML = <employees>
		<employee><name>Joe</name></employee>
		<employee><name>Fred</name></employee>
		<employee><name>Carol</name></employee>
		<employee><name>Sue</name></employee>
	</employees>;

nameがCarolであるemployeeを抜き出したい場合は

trace(employees.employee.(name == "Carol"));

簡単ですね。

では、こんなXMLの場合はどうでしょうか。

var names:XML = <names>
		<name>Joe</name>
		<name>Fred</name>
		<name>Carol</name>
		<name>Sue</name>
	</names>;

先ほどの場合のnameにあたるプロパティ名が存在しません。

やり方の一つとして、toString()を使う方法があります。

trace(names.name.(toString() == "Carol"));

選別述語演算子が動作している間、左オペランド(=XMLListの各XML)がスコープチェーンに加わるため、各XMLにとってのtoStringが呼ばれるわけです。 ただしスコープチェーンの最後(という表現でいいのか分かりませんが)に加わるため、他にアクセスできるtoStringがある場合、そっちを見てしまいます。

追記:childrenを使う方が衝突を減らせるかもしれません。

trace(names.name.(children()[0] == "Carol"));

トラックバックURL

http://faces2.bascule.co.jp/mt/mt-tb.cgi/538

コメントを投稿

(コメントには承認が必要になることがあります。承認されるまではコメントは表示されません。)