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"));