最初に ymlist.xml を読み込んでログの存在する年と月を調べます。

私個人としては ActionScript を書く時は変数の定義やメインのスクリプトをそれぞれ別のレイヤーに分けて管理をしやすいようにしています。今回もそれに従って変数定義、メイン処理、onLoad イベントが発生した時の3つのレイヤーを作ります。

まず「変数定義」レイヤーを作成して ymlist.xml のXMLデータを入れるオブジェクトを定義します。

// 年と月を定義したXML
ymlist_xml = new XML();
ymlist_xml.ignoreWhite = true;


次に「main」レイヤーを作成して ymlist_xml オブジェクトに ymlist.xml の内容を読み込ませます。

ymlist_xml.load("ymlist.xml");


ymlist.xml の読み込みが完了すると ymlist_xml オブジェクトに onLoad イベントが発生するので、そこから ymlist_xml の内容を解析していきます。

ymlist_xml.onLoad = function() {


まず親となる ymlist タグを取り出します。

 // ymlist タグを解析して年を取り出す
 var tmp_year_xml = ymlist_xml.firstChild;


一番新しいログのある年と月を配列 firstLoad に入れます。この時 ymlist.xml の中のXMLデータが新しい情報をファイルの最初の方に追加していくようにしていなければなりません。

 // 最初に読み込むエントリを設定
 firstLoad = new Array();
 firstLoad["year"] = tmp_year_xml.attributes["year"];
 firstLoad["mon"] = tmp_year_xml.firstChild.firstChild.nodeValue;

年のデータは ymlist タグの year 属性で指定されているので attributes["year"] で取り出し、月のデータは ymlist タグの子ノードである month タグで定義されているので firstChild.nodeValue で取り出します。(month タグの中のデータも1つのノードとして扱うため、firstChild.nodeValue と指定しなければ情報を取り出せません)

}

最後に } で ymlist_xml.onLoad の関数を閉じます。

以上で ymlist.xml のXMLを読み込んで次に読み込むファイルを定義できました。次回は配列 firstLoad を使用して一番新しいログの存在する月のログリストを取り出す予定です。


今回のスクリプトを収録した .fla ファイルと構成するフォルダや日記データのファイルをダウンロードできるようにしました。バージョンはFLASH MXです。
>> ダウンロード
SEOの見地から言うとFLASHコンテンツはgoogleでは検索対象にならないというのが一般的な認識でしたが、どうやらそれが覆されようとしているようです。

googleの検索フォームに「filetype:swf」と入力するとswf形式(いわゆるFlashですね)のファイルを検索することができるのですが、そこで更に「filetype:swf 検索」というキーワードで検索すると「検索」というテキストの入ったswfファイルが結果に表示されます。

そこで気になって少し調べてみたところ、現在のところgoogleの検索対象となるのはswfファイルの中にある静的なテキストだけで、ダイナミックテキストなどの外部テキストファイルやCGIを連携させてswfに表示させたテキストは検索対象とはならないようです。技術的に非常に難しいのだと思いますが、これが実現しないことにはまだgoogleのFLASH検索は実用的ではないと言わざるを得ないでしょう。

もしダイナミックテキストが検索対象になったら、FLASHをblogのようなコンテンツにも十分使えると思います。とりあえず現在の段階で実験的にダイナミックテキストを使ったswfファイルを置いてどうなるかを試してみるという手もありますが。
他の言語がそうであるように、ActionScriptでも配列(Array)や構造体(Object)を扱うことができ、定義された配列や構造体の中に更に配列や構造体を作ることができます。

例えば縦3行、横5列の表のデータを扱いたい場合は次のようにします。

table_array = new Array();

table_array[0] = ["0-0", "0-1", "0-2", "0-3" ,"0-4"];
table_array[1] = ["1-0", "1-1", "1-2", "1-3" ,"1-4"];
table_array[2] = ["2-0", "2-1", "2-2", "2-3" ,"2-4"];

配列 table_array の縦2行目、横4列目のデータを取り出したい場合は

trace(table_array[1][3]);

と記述します。


配列の中に構造体を作る方法は以下のとおりです。これは例えば学校の出席番号やサービスの会員番号を基準とした情報の格納に用ることができます。

member_array = new Array();

member_array[0] = {surname:"波多野", name:"憲二", age:20, sex:"male"};
member_array[1] = {surname:"洞口", name:"雄大", age:20, sex:"male"};
member_array[2] = {surname:"岡泉", name:"誠二", age:27, sex:"male"};
member_array[3] = {surname:"青島", name:"優子", age:20, sex:"female"};

会員番号3番の年齢を知りたいときは

trace(member_array[3]["age"]);
または
trace(member_array[3].age);

と記述します。

構造体へのアクセスは上記のように2種類の方法がありますが、[]で囲めば変数を用いることができます。

flag = "surname";

trace(member_array[2][flag]);

このスクリプトでは結果として「岡泉」というテキストが返されます。


構造体の中へ構造体を作る方法はこれまでとほぼ同じです。

address_obj = new Object();

address_obj["国会議事堂"] = {region:"東京都", city:"千代田区", address1:"永田町", address2:"1-7-1"}
address_obj["皇居"] = {region:"東京都", city:"千代田区", address1:"千代田", address2:"1-1"}
address_obj["東京都庁"] = {region:"東京都", city:"新宿区", address1:"西新宿", address2:"2-8-1"}


このように配列と構造体を組み合わせれば幅広いデータを扱うことができますが、あらかじめしっかりと構造を設計しておかないと後で大変なことになりますので注意してください。また、XMLのデータを整理する場合にもこの方法を使うことができます。
まず先にも述べた通り、FlashでXMLを利用するにはXMLオブジェクトを利用します。

xmldata = new XML(); // XMLオブジェクト xmldata を作成


XMLを作成するときは見やすいように改行やタブを使用すると思いますが、このままでは読み込んだときにタブや改行まで空のノードとして扱ってしまいます。それを解除するには ignoreWhite を使います。

xmldata.ignoreWhite = true; // タブや改行を無視


FlashMX以降のバージョンでは外部読み込みに使用するテキストはUTF-8を利用することになっているので、XMLファイルはUTF-8で保存しておいてください。どうしてもShift_JISを使用したい場合はスクリプトの一番最初に以下のスクリプトを追加してください。

System.useCodepage = true;

これで基本的な設定は完了。次に肝心のXMLファイルを読み込みます。

xmldata.load("xmlfile.xml");

これだけで xmlfile.xml という名前のファイルを読み込みに行きます。
読み込みが完了すると onLoadイベントが発生します。

xmldata.onLoad = function() {
 trace(xmldata); // 出力ウィンドウに xmldata のXMLデータを表示
}


XMLの例として、Flashでblogを作る場合のデータを利用します。

<blogdata>
 <date year="2004" month="09" day="30"/>
 <title>9月30日の日記</title>
 <content>日記データ</content>
</blogdata>


読み込んだXMLオブジェクトからデータを取り出すには親ノード(<blogdata>)から順番に辿って行きます。

rootnode = xmldata.firstChild; // ノード <blogdata> の中のデータを参照する。

この先の <date> や <title> を参照するには直接場所を指定する方法と、先頭から順番に取り出す方法があります。

// 直接場所を指定する方法
blodtitle = xmldata.childNodes[0].childNodes[1].nodeValue; // <title> タグの要素を取り出す

childNodes はXMLオブジェクトのノードを配列で返します。
nodeValue はタグで囲まれた要素を取り出します。

// 先頭から順番に取り出す方法
while (rootnode != null) {
 trace(rootnode.firstChild.nodeValue); // 先頭から順番に各ノードの要素を取り出す
 rootnode = rootnode.nextSibling; // 次のノードに移動
}


nextSiblig を使用することで次のノードに移動することができます。

<date year="2004" month="09" day="30" /> の中の year や month といった属性を取り出すには attributes を使用します。例えば属性 month の値を取り出すには以下のように書きます。

trace(rootnode.attributes["month"]); // 属性 month の値を取り出す

ちなみに attributes はそのノードに含まれる属性を全て取り出すことにも使われます。

以上のように初心者がXMLデータを扱うにはちょっと敷居が高いように感じますが、いろいろと試してみるとすぐに理解できると思います。かく言う私も参考書は常に手放せませんが・・・。
Flashで外部ファイルからデータを読み込むには MovieClip オブジェクト の loadVariables メソッドを使う方法と、XML オブジェクトの load メソッドを使う方法があります。

MovieClip オブジェクトを使用する場合、外部ファイルの中身は

name=hoge&age=20&sex=male

と言った具合に「変数名=値&変数名=値」という内容になり、途中に改行を入れることもできませんが、XMLオブジェクトを使用すると外部ファイルの中のデータはXMLを利用するのでデータの扱いが非常に簡単になります。更に変数の数が多くなった場合、XMLの方が処理速度が速いというメリットもあります。

以上の理由から、今後はFlashから外部データをやりとりする場合はXMLを使用するのが主流になるでしょう。

そこで、Flashから外部ファイルのXMLを扱う方法を紹介します。ちなみに参考に秀和システムの「Flash MX ActionScript逆引き大全 500の極意」を利用しています。

(2)に続く