>>Flaファイルをダウンロード

とうとうこのエントリーを最後に、このサンプルともお別れですね。
そういえば、このサンプルの元ネタとも、今週でお別れですね。寂しいものです。

さて、前回はエレメントの生成・追加をやったのですが、その際にエレメントがダブってしまうのは、あんまりよろしくないぞ。
というわけで、「XMLクラスに、例えば指定エレメントのノードがあるかどうか調べるメソッドでもないかしら?」と思って探してみたのですが、残念ながらそんな便利なメソッドはありませんでした。

例えば
XMLデータ.何かしらのメソッド(@id == "なんか文字列");
で、Boolean型を返してくれると非常にありがたかったのですが・・・

しかし、無いもんは無い。って事で、他の処理で代用するしかありません。
要するに、指定した値での、XMLエレメントの有無チェックが出来ればいいのです。

というわけで実験。

if(test_xml.member.(name =="田井中 律") ){
    trace("エレメントがありますよ~ノシ");
}

 「エレメントがありますよ~ノシ」と出力されます。
しかし・・・

if(test_xml.member.(name =="ありえないエレメント") ){
    trace("エレメントがありますよ~ノシ");
}

「エレメントがありますよ~ノシ」と出力されます。
最悪だ・・・。

そこに、救世主が現れた。
その名も「toXMLString()メソッド

そもそもこのメソッドは、実行したXML オブジェクトのエレメントのストリング表現を返すメソッドです。
なので、例えば「test_xml.member.(name =="田井中 律").toXMLString()」を実行すると

<member part="Dram">
  <name>田井中 律</name>
</member>

上記の値を、XMLデータではなく、String値で返します。
大切なことなので2回言いますが、上記データは、XMLデータではなくStringデータです。

そして、上記のスクリプトを

if(test_xml.member.(name =="田井中 律").toXMLString() ){
    trace("エレメントがありますよ~ノシ");
}

if(test_xml.member.(name =="ありえないエレメント").toXMLString() ){
    trace("エレメントがありますよ~ノシ");
}

このように記述すれば、上のコードは、「エレメントがありますよ~ノシ」と出力され、下のコードは何も出力されません。else節があれば、そちらが実行されます。

てなわけで

前回のエントリーの、あずにゃん追加ボタン部分の関数を

/*----------------------------------------------
■addAzusaHandler
■概要
test_xmlにazunyan_xmlを追加する。
----------------------------------------------*/
function addAzusaHandler(event:MouseEvent):void{
    var azunyanName:String = azunyan_xml.name.toString();
   
    //test_xmlにあずにゃんがいたらreturnする。
    if(test_xml.member.(name == azunyanName).toXMLString() ){
        return;
    }
   
    test_xml.appendChild(azunyan_xml);
    inIt();
}

このように書き換えました。

var azunyanName:String = azunyan_xml.name.toString();

で、追加予定のXMLデータのnameエレメントの値を取得して、

if(test_xml.member.(name == azunyanName).toXMLString() ){
    return;
}

 上記処理で、当該memberエレメントが既に存在していたら、returnで、関数から抜けます。

つぎに俺も入部ボタン部分の関数を

/*----------------------------------------------
■addOreHandler
■概要
oreNameの値とorePartの値から、XMLノードを生成して
test_xmlに追加する。
----------------------------------------------*/
function addOreHandler(event:MouseEvent):void{
    var nameStr:String = oreName.text;
    var partStr:String = orePart.text;
   
    //テキストが空の場合return
    if(nameStr == "" || partStr == ""){
        return;
    }
   
    //名前・パートが被る場合return
    if(test_xml.member.(@part == partStr).(name == nameStr).toXMLString() ){
        return;
    }
   
    //入力内容から、XMLを生成する
    var addXML:XML = <member part={partStr}><name>{nameStr}</name></member>;
    test_xml.appendChild(addXML);
    inIt();
}

 こんな風に書き換えます。
こちらは、名前・パートの両方で抽出しています。一人の人間が複数パートを担当したり、ひとつのパートに複数担当がいたりってのはよくあるんで、Jazzとかオーケストラだと特に。

>>Flaファイルをダウンロード

しつこく、このサンプルを使います。

さて、次にプログラムからXMLエレメントを生成したり、XMLオブジェクトにエレメントを追加する方法を解説します。
これが出来ると、他のアプリケーションとのデータのやり取りの際に、統一された汎用フォーマットを利用できるので、開発が楽になります。

上記サンプルだと、「あずにゃん入部」ボタンと「俺も入部」ボタンになりますね。

あずにゃん入部ボタンは予め用意した下記のようなXMLデータを利用しています。

//あずにゃんのデータ
var azunyan_xml:XML =
<member part="Guitar">
    <name>中野 梓</name>
</member>;

 追加するボタンの処理は

test_xml.appendChild(azunyan_xml);

 このように、「XMLデータ.appendChild(追加するXMLデータ)」と記述します。
すると、「<houkagoTeaTime>」エレメントの末尾に、指定したXMLデータが追加されます。

その後、コンボボックスのデータプロバイダの設定処理を行えば、入部した部員やパートがコンボボックスに追加されます。

次に「俺も入部」ボタンで、入力データから生成したエレメントの挿入は

var nameStr:String = oreName.text;
var partStr:String = orePart.text;

//テキストが空の場合return
if(nameStr == "" || partStr == ""){
    return;
}

var addXML:XML = <member part={partStr}><name>{nameStr}</name></member>;
test_xml.appendChild(addXML);

 このように記述します。「oreName」「orePart」はそれぞれテキスト入力のテキストフィールドです。どちらかのテキストが入ってなかったら、returnによって、以降の処理を飛ばします。

キモになるのは、

var addXML:XML = <member part={partStr}><name>{nameStr}</name></member>;

この部分です。
ここで実際に入力データを格納した変数から、XMLエレメントを生成してるのですが、その際XML表現の中に変数を使う場合は「{変数名}」とします。

もし、{}を使用しなかった場合、「partStr」や「nameStr」は普通に文字列として扱われて、下記のようなXMLエレメントになってしまいます。気をつけましょう。

<member part=partStr>
    <name>nameStr</name>
</member>;

 これで、XMLデータの動的な生成が出来ましたが、問題が残ってます。
このままだと、あずにゃんが何人も何人も、桜高校軽音部に入部できてしまいます。

それはいけません。

なぜなら僕らの生きがいに、あずにゃんは一人だけです。だからこそ可愛いのです。

それ以外にも、例えばコンボボックスにデータを再設定する際に、「その1」のやり方のまんまだと、あずにゃんを追加した場合に、Guitarの選択肢が2つ入ってしまったりといった残念が発生します。

てなわけで、次回はエレメントの有無をチェックしたり、ユニークチェックしたりとかそういう処理を紹介します。

プロフィール

HN.NoBody

NoBody

市ヶ谷のとあるオフィスでFlashクリエイターとして労役中。
なんとなくチーフ。