FlashMX とXML統合
ここでは、Flashファイルに最初のコードブロックを追加して、XMLフラグメントを収めたファイルを読み込み、ExtractData関数を呼び出します。この関数は、すべてのXMLタグを巡回して、それらのタグに収められているデータを格納します。
まずFlashを立ち上げます。
背景・データなどを配置した後、「ActionScript」レイヤーの最初のキーフレームを選択して、以下のように書き込みます。
//XMLオブジェクトの宣言とデータファイルの読み込み
applicant = new XML();
applicant.onLoad = ExtractData;
applicant.load("applicant.xml")このコードでは、まず「applicant」という名前のXMLオブジェクトを作成します。appicantオブジェクトは、「applicant.xml」ファイルからのXMLデータを保存するために使われます。
このメソッドにはXMLデータファイルが読み込まれた後に実行する任意の関数を割り当てることができます。そのため、Flashが完全なXMLファイルを取得した後、onLoadメソッドに指定した関数が自動的に呼び出されるので、XMLファイルのデータがすべて読み込まれたことを主導で確認する必要はありません。
このメソッドは、指定されたファイルを読み込んで、その内容をXMLツリーに解析します。ここでは、applicantオブジェクトに読み込んで解析するファイルとして「applicant.xml」ファイルを指定しています。
ExtractData関数を開始するコードを挿入します。
//ExtractData関数
function ExtractData(){
//配列と変数の宣言
Name = new Array();
Lnamek = new Array();
Fnamek = new Array();
Fields = new Array()
FieldTags = this.lastChild.childNodes;
//調べるタグの設定
FieldData = newArray("lnamen","fnamen","lnamek","fnamek","byear","bmonth","bday","age","sex","zip","prefecture","mainaddress","subaddress","tel","cellular","fax","email","education","work","ability","qualification","wish","today");ExtractData関数では、まずいくつかの重要な要素を宣言および定義します。
Lname、Fields、FieldTags、FieldDataは、すべて配列で、データの保存および操作に使います。
Lname配列は、XMLデータから取り出された 名前を保持します。Fields配列は、各個人データを保持します。FieldTags配列は、XML情報(this.lastChild, childNode)を実際に保存するために使われます。「this」は、関数を呼び出しているオブジェクトです。これは関数呼び出しで渡される「見えない」引数です。ここでは、XMLオブジェクトであるapplicantオブジェクトをさしています。
「this.lastChild」は、「applicant.xml」ファイルの<applicant>タグ(一番上位のタグ)です。「this.lastChild.childNode」は、<applicant>タグ内にネストされている<Field>タグの配列になります。この配列では、23個のテキスト文字列から構成されています。それぞれの文字列は<Field>タグ内部にネストされているタグ名と同じです。それぞれの個人情報にあたるものを
<lnamen> <fnamen> <lnamek> <fnamek> <byear><bmonth> <bday> <age> <sex> <imageURL> <zip> <prefecture> <mainaddress> <subaddress <tel> <cellular> <fax> <email> <education> <work> <ability> <qualification> <wish> <today>
に記録するために利用します。ExtractData関数の続きのコードを記述します。
//利用可能なXMLのタグを一巡し、ノードの値を取り出す
for(CounterA in FieldTags){
if (FieldTags[CounterA].nodeName=="Field"){
Fields[Fields.kength] = new Object();このコードでは、すべてのXMLデータを一巡して関連する情報を取り出すいくつかのループを開始します。
ここでは、 FieldTags配列のすべての要素をカウントする「for.....in」ループを開始します。
CounterAは、このループに対するカウンタとして使う変数です。ループ最初の行では、ifアクションでCounterAの値を使って、XMLデータの<Field>タグを調べます。現在のノード名が<Field>であれば、Fields配列に新しい要素を追加して、後から操作できるようにします。FieldTags配列の要素を参照するには、配列アクセス演算子([ ])を使います。ここでは、新しい要素にアクセスするために、配列アクセス演算子内でCounterAを使っています。CounterAが「1」であれば、「FieldTags[CounterA]」は「FieldTags[1]」になります。
FieldTags配列の各要素には、 「applicant.xml」ファイルから取り出されたXMLデータノードが含まれています。各ノードは名前と値を持ちます。ここで必要なのは「Field」という名前のすべてのノード(タグ)です。このため、ifアクションで「FieldTags[CounterA].nodeName」の値を調べ、それが「Field」であるかどうかを確認します。Fields[Fields.kength] = new Object(); の行は、ステートメントの条件で<Field>タグが見つかった場合のみ実行されます。新しい<Field>タグが見つかると、Fields配列に新しい要素が追加されます。
ExtractData関数の続きに次のコードを記述します。
for (CounterB in FieldTags[CounterA].childNodes) {
Name[CounterA] = Lnamek[CounterA]+Fnamek[CounterA]
CurrentNode = FieldTags[CounterA].childNodes[CounterB].nodeName;
ChildValue = FieldTags[CounterA].childNodes[CounterB].firstChild.nodeValue;このステートメントのセットは、上の「続き(1)」で入力したコードによって<Field>タグが見つけられるたびに実行されます。
これらのステートメントは、以降のコードを記述しやすくするためのものです。「=」の右側のオブジェクトアドレスは非常に長くて扱いにくいので、予め短くて説明的な名前の変数に割り当てることでああとの作業を楽にしています。
変数 「CurrentNode」は、lnamen、fnamen、lnamek、fnamek、byearといったサブ項目を保持します。
変数「ChildValue」 は、にしやま、まりこ、西山、万梨子、(空タグ)といった、サブ項目の実際の内容を保持します。
これらの情報は、後のほうでカタログメニューを作成するために使います。ここでの「for.....in」ループは、<Field>タグ内にネストされているすべてのタグをカウントし、2つ目のカウンタ変数CounterBに利用します。つまり、<Field>タグの中をループするためにCounterAを利用する一方で、CounterBは各サブ項目のタグの中をループします。
このループでは、まず変数 CurrentNodeに現在の子のタグを保持し、変数ChildValueに子のタグに収められている実際のテキストを保持します。例えば、CurrentNodeは<imageURL>タグで、ChildValueは「nishiyama.swf」になります。各々の子タグは「FieldTags[i].childNodes」(iはそれぞれのタグ値)という名前でアクセス可能です。
ExtractData関数に次のコードを追加します。
for (Element in FieldData) {
if (Element != "length" && CurrentNode == FieldData[Element]) {
if (CurrentNode == "lnamek") {
Matches = 0;
for (CounterC = 0; CounterC < lnamek.length; CounterC ++) {
if (Lnamek[CounterC].Name == ChildValue) {
Matches ++;
}else if (CurrentNode == "fnamek") {
Selects [Selects.length]
}
}
// 一致するものがなければ新しいカテゴリを作成
if (Matches == 0) {
Lnamek[Lnamek.length] = new Object();
Lnamek[Lnamek.length - 1].Name = ChildValue;
Lnamek[Lnamek.length - 1].Expanded = false;
}
}このステートメントのセットは、XMLオブジェクトから取得したデータを実際に保存し始める部分です。
ExtractData関数に次のコードを追加します。
CurrentField = Fields[Fields.length - 1];
eval("CurrentField." + CurrentNode) = ChildValue;
}
}
}
}
}
BuildMenu();
}