ActionScript3(AS3)でXMLの特定のノードにid属性を使ってアクセスするためのメモ。
AS2でいうところのidMap[]だったり、JavaScriptのgetElementById()とかと同様の処理をしようと思ったら意外にハマッてしまった。AS3の仕様が厳格なのか、それとも単なる気まぐれなのかわからないけど、一応メモ。
<body>
<p id='123'>Hello, <b>Bob_1</b>.</p>
<p id='124'>Hello, <b>Bob_2</b>.</p>
<p id='125'>Hello, <b>Bob_3</b>.</p>
<p id='126'>Hello, <b>Bob_4</b>.</p>
<p id='127'>Hello, <b>Bob_5</b>.</p>
<p><b><p id='128'>Hello, <b>Tom</b>.</p></b></p>
</body>
こんな感じのXMLに対してid"128"にアクセスする場合、
AS2だとこう↓
var doc:XML = new XML("<body><p id='123'>Hello, <b>Bob_1</b>.</p><p id='124'>Hello, <b>Bob_2</b>.</p><p id='125'>Hello, <b>Bob_3</b>.</p><p id='126'>Hello, <b>Bob_4</b>.</p><p id='127'>Hello, <b>Bob_5</b>.</p><p><b><p id='128'>Hello, <b>Tom</b>.</p></b></p></body>");
trace(doc.idMap['128']);//<p id="128">Hello, <b>Tom</b>.</p>
AS3だとこう↓
var doc:XML = new XML(
<body>
<p id='123'>Hello, <b>Bob_1</b>.</p>
<p id='124'>Hello, <b>Bob_2</b>.</p>
<p id='125'>Hello, <b>Bob_3</b>.</p>
<p id='126'>Hello, <b>Bob_4</b>.</p>
<p id='127'>Hello, <b>Bob_5</b>.</p>
<p><b><p id='128'>Hello, <b>Tom</b>.</p></b></p>
</body>
trace(doc.descendants().(attribute('id') == '128'));//<p id='128'>Hello, <b>Tom</b>.</p></b>
//trace(doc.(attribute('id') == '128'));//これだと何も返さない(空白)
//trace(doc.descendants().(@id == '128')); //これだとランタイムエラー
//trace(doc.(@id == '128')); //これもランタイムエラー
//trace(doc..(@id == '128')); //これだとコンパイルエラー
AS3の場合、子ノードや孫ノードを含めてid属性を検索する場合、descendants()が必要になるみたいです。AS2のidMapの感覚からするとdoc.(attribute('id') == '128'やdoc.(@id == '128')でアクセス出来そうな気がするけど、これは不可。
とくに@idを使った場合、同一階層の他のノードにid属性がない場合、ランタイムエラーを返すので要注意。
AS3になって、かなりXML環境が強力かつ便利になったみたいでとても格好いいな~と思っていたけど、上記の問題を解決するのに半日費やしてしまった。いまいちFlashのヘルプが貧弱な気がする。
まあとりあえず解決できたので、習作として為替レート表示Flashか天気予報Flashとかベタなコンテンツを作ってみよう。