- 2009年5月 7日 16:36
- ActionScript 3.0
ActionScript 3.0では、E4X(ECMAScript for XML)をサポートしすることで、より柔軟で強力なフィルタリング機能を得ました。
ActionScript 2.0だとこの辺りが非常にややこしく、for地獄になりがちでしたが、ActionScript 3.0はかなりスマートです。
descendant accessor演算子
これは子孫演算子と呼ばれ、..で表します。
var doc:XML = <body> <div id="head"> <h1>Test</h1> <p>hello world</p> </div> <div id="content"> <h2>Sample</h2> <p id="update">Example</p> </div> </body>;
上記のようなXMLインスタンスdocに含まれるXMLListエレメントpにアクセスしようとしたとき、子孫演算子を使わなかった場合、以下のようにdot演算子を用いてアクセスできますが、そこまでの子孫を辿る必要があります。
doc.div.p
しかし、子孫演算子を用いれば次のように簡潔にアクセスすることが可能です。
doc..p
XMLインスタンスdocには、pが複数存在するため、以下のようなXMLListインスタンスが返ります。
<p>hello world</p> <p id="update">Example</p>
では属性idを持つpにアクセスしたいとき、どうすればよいでしょうか?
parentheses (XML) 演算子
parentheses演算子は()で表し、選別述語演算子とも呼ばれます。()内に絞り込みの式を記述することでオペランドを評価し、等価だった場合XMLListを返します。
doc..p.(@id)//Example
一般的な記述は上記の通りで、属性値で絞り込む場合には@を接頭辞とします。これで期待値が返ってくるはずですが、多くの場合エラーが発生します。
ReferenceError: Error #1065: 変数 @id は定義されていません
parentheses演算子は実行時に対象を走査します。属性で絞り込む場合、属性が対象に必ずしもあるとは限りません。この場合、docでは、div#head内のpには属性idは定義されていないのです。
これを解決するにはhasOwnPropertyが有効です。
doc..p.(hasOwnProperty("@id"))//Example
Object.hasOwnPropertyメソッドを使うことで、属性が存在するか評価します。
- Newer: Spark67 Part2でしゃべります。
- Older: POKENを買ってみた



