ActionScript 3.0でXMLを扱う仕組みが簡単になって凄く楽になりましたねぇ。
上のサンプルでは、一番右のテキストエリアに生XMLデータ、左のテキストエリアに、左側のコンボボックスから抽出されたエレメントのみを表示するようになっています。
さらに、新しいエレメントの追加や、ユーザーの入力から新たなノードを作る機能と、追加される際に、すでに登録されいるかどうかを調べて、2重登録を防ぐ機能を実装しています。
とはいえ、いきなり全機能を解説するのはアレなんで、何回かに分けて、ActionScript3.0でXMLを扱う仕組みをちょこっと解説してみようと思います。
まずはXMLを用意しましょう。
//テスト用XMLデータ
var test_xml:XML =
<houkagoTeaTime>
<member part="Guitar">
<name>平沢 唯</name>
</member>
<member part="Bass">
<name>秋山 澪</name>
</member>
<member part="Keyboard">
<name>琴吹 紬</name>
</member>
<member part="Dram">
<name>田井中 律</name>
</member>
</houkagoTeaTime>;
こんな感じでScriptを書きます。AS3.0では、コード内にもXMLを記述出来るんで、一々読み込む必要のないデータや、構造体を作って管理していた変数なんかは、今後XMLに統一するのもいいかもしれませんね。
さて、早速これをプログラム内で使ってみましょう。
てことで、左側のコンボボックスにXMLのデータから、値を抽出して、初期設定してみましょう。
import fl.data.DataProvider;
//コンボボックスのデータプロバイダ。
var nameItems:Array;
function setNameCmb(){
nameItems = new Array();
for each(var elements:Object in test_xml.member){
nameItems.push({
label:elements.name.toString() ,
data:elements.name.toString()
});
}
nameCmb.dataProvider = new DataProvider(nameItems);
}
サンプルの、「名前で抽出のコンボボックス」の設定の記述です。
nameCmbは、コンボボックスのインスタンス名ですので、コードの最後の
nameCmb.dataProvider = new DataProvider(nameItems);
この記述で、コンボボックスに「XMLから抽出した値を構造体に格納した配列」を設定しています。
んで、実際にXMLに対して処理をしてるのが
for each(var elements:Object in test_xml.member)
になります。
for eachは、()内の「in」の後ろに記述された、XMLエレメントに対して、エレメント数分、繰り返し処理を行います。
このプログラムだと「test_xmlの、memberというエレメントの数分、繰り返し処理をしなさい」という意味で、さらに「in」の前 の「var elements:Object」は、処理の対象のエレメントの一時確保変数です。まぁ「for文」の「var i:int = 0」みたいなもんだと思って下さい。
なので、正しくは「test_xmlの、memberというエレメントの数分、elementsという変数名で、繰り返し処理をしなさい」となります。
コンボボックスのデータプロバイダは、「label」と「data」が入った構造体の配列を使用するので
nameItems.push({
label:elements.name.toString() ,
data:elements.name.toString()
});
このようになります。
これで、たとえば「nameItems[0].label」とか「nameItems[2].data」とかで、値をとりだすことができるようになります。要するに、「label」と「data」という2つのデータを対にして、リスト的に扱えるようになるわけです。
なるほど、コンボボックスとは相性が良さそうです。
ActionScript3.0では、「タグ名.タグ名」という風に、「childNode」とか書かずに、直接タグ名でエレメントを操作できるので、
label:elements.name.toString()
これだけで、対象ノードのデータを取得することができます。
上の例だと、elementsは、for each の処理対象のtest_xml.memberエレメントなので、
test_xml.member[i].name.toString();
て な具合になりますね。ちなみに、複数のノードがある場合は、上のように「test_xml.member[5]」とかで、直接エレメントにアクセスすることが できるので、for each を使わなくても、通常のfor文使って、[i]でXMLエレメントを操作しても構いません。for eachを使った方が圧倒的に楽ですが・・・
何はともあれ、これで晴れてバンドメンバーの名前を抽出出来ました。
では次は担当パートを抽出してみたいところですが、こちらは「<member part="Bass">」のように、属性になっています。さてどうやってとりだそう・・・
AS2.0時代は、attributeなんてもんを使ってましたが、AS3.0からは
test_xml.member[i].@part.toString();
でOK。名前の前に「@」をつけるだけ。
なので、コンボボックスの「パートで抽出」は
partItems.push({
label:elements.@part.toString() ,
data:elements.@part.toString()
});
これでOK。
ただし、ひとつのバンドに同じ楽器担当が複数いる場合もあるので(ツインギターとかツインボーカルとか)ユニークチェックをかけたりしてるんですが、それはまた次の機会に。



コメントする