as3 XMLデータを扱うための基礎

図2●読み込むXMLファイルの内容

//「xmlData.xml」を読み込んで,変数xmlに格納
var xml:XML;
/*読み込み処理自体はテキスト・ファイルと同じく
URLLoader+URLRequestで作成*/
var loader:URLLoader = new URLLoader();
var request:URLRequest = new URLRequest("xmlData.xml");
loader.addEventListener(Event.COMPLETE,traceData);
function traceData(event:Event) {
  //読み込んだ内容を元に,XMLデータを作成
  xml = new XML(event.target.data);
  trace("あんぱんの価格は、" +
    xml.item.(name=="あんぱん").price + "円です。");
}
loader.load(request);

●取り出せるエレメント
コード 結果
trace(xml);
<data>
  <item id="1">
    <name>あんぱん</name>
    <price>80</price>
  </item>
</data>
trace(xml.item);
<item id="1">
  <name>あんぱん</name>
  <price>80</price>
</item>
trace(xml.item.name); あんぱん
trace(xml.item.price); 80

XMLから数値のデータを取り出す場合に注意したいのは,取り出した時点では,データは文字列扱いということです。例えば,上記のXMLドキュメントツリーを使って,

trace(xml.item.price+100);

というコードを記述すると,「80+100」で,結果は「180」ではなく,文字列の「80」と「100」を結合して,結果は「80100」となります。数値として扱う場合には,intやNumberなどで数値に変換してから使用する必要があります。

trace(int(xml.item.price)+100);

これならば,「180」という結果を得ることができます。

エレメントへのアクセス方法がわかったところで,今度は属性(attribute)へアクセスしてみましょう。属性にアクセスするには「@」(アットマーク)記号を使用します(表4)。

表4●任意の属性にアクセスする記号

記号 意味
@ 属性へアクセス

今度は次のようにXMLデータを作成したとします。

var xml:XML =
<data>
  <item id='1' type='sweet pastry'>
    <name>あんぱん</name>
    <price>80</price>
  </item>
</data>

このとき,itemエレメントの「id」属性や,「type」属性にアクセスするには,次のようにコードを記述します(図5)。

trace("idの値は、" + xml.item.@id);
trace("typeの値は、" + xml.item.@type );
図5●任意の属性にアクセスする
図5●任意の属性にアクセスする

まとめてみると,エレメントを辿って行きたい場合には「.」を使い,エレメントの属性にアクセスしたい場合には「@」を使えばよいわけですね。ActionScript2.0の時と比べるとずいぶん使いやすくなりました。

任意のエレメントのリストを取得する

XMLドキュメントツリーからデータを取得する場合には,「itemエレメントを全部まとめて取得して,処理したい」など,任意のエレメントのリストを 取得したい場合があります。こんなときには,どのようにコードを記述すれば良いのでしょうか。下記のようなXMLドキュメントツリーを元に,実際のコード を見て行きましょう。

var xml:XML =
<data>
  <item id='1'>
    <name>あんぱん</name>
    <price>80</price>
  </item>
  <item id='2'>
    <name>メロンパン</name>
    <price>100</price>
  </item>
  <item id='3'>
    <name>カレーパン</name>
    <price>120</price>
  </item>
</data>

まずは,「itemエレメントをまとめて取得したい」場合です。これはとても簡単で,

xml.item

と記述すればOKです。すると,XMLクラスでは,ひとつ下の階層内の「item」というエレメントを探し,みつかったエレメントをコレクションとして束ねて,リスト(XMLListクラスのインスタンス)として返してくれます。

サンプルのXMLドキュメントでは,ルートとなるエレメントである「data」のひとつ下の階層には,「item」エレメントが3つありますね。この3つをメンバーに持つリストを返してくれるというわけですね。

実際にコードを記述して,確かめてみましょう(図6)。

//itemエレメントのリストを取得
var xmlList:XMLList = xml.item;
//リストのメンバー数を取得
trace("取得できたエレメントの数は、" + xmlList.length());
//個々のメンバーにアクセス
trace("---n1番目のメンバ:n" + xmlList[0]);
trace("---n2番目のメンバ:n" + xmlList[1]);
trace("---n3番目のメンバ:n" + xmlList[2]);
図6●みつかったエレメントをリスト(XMLListクラスのインスタンス)として返す
図6●みつかったエレメントをリスト(XMLListクラスのインスタンス)として返す

元のXMLドキュメントから,「item」という名前のエレメントをリストの形で抜き出せていることが確認できますね。

得られたXMLList形式のリストのメンバー数を知りたい場合には,「lengthメソッド」を使用します。Arrayクラス等で は,lengthプロパティですが,XMLListクラスでは,メソッドである点に注意しましょう。つまり,「xmlList.length」ではなく て,「xmlList.length()」とコードを記述する必要があるわけですね(筆者はいまだによく間違えます)。

また,XMLListの形式で格納された各メンバーにアクセスしたい場合には,配列(Arrayクラス)と同じように,「[ ]」(配列アクセス演算子)を使って,0から始まるインデックス番号を指定してあげればOKです。

と,いうことは,すべてのメンバーに対する処理も,このインデックス番号を利用すればOKですね(図7)。

//itemエレメントのリストを取得
var xmlList:XMLList = xml.item;
//すべてのメンバーのnameとpriceを表示
for(var i:int = 0;i<xmlList.length();i++){
  trace(xmlList[i].name + "の価格は、" + xmlList[i].price);
}
図7●すべてのメンバーに対してループ処理を行う
図7●すべてのメンバーに対してループ処理を行う

このループ処理は,for eachステートメントを利用して,次のように記述しても良いですね。こちらのほうが,わかりやすいという方も多いかもしれません。

//itemエレメントのリストを取得
var xmlList:XMLList = xml.item;
//すべてのメンバーのnameとpriceを表示
for each(var element:XML in xmlList){
    trace(element.name + "の価格は、" + element.price);
}

条件式を使ってエレメントやリストを取得する

「nameの値が『あんぱん』のエレメントのpriceの値を取得したい」など,何らかの条件式を使って,XMLドキュメントツリーの中から,任 意のエレメントを抽出したり,リストを抽出したい場合があります。このようなケースでは,「( )」(括弧)の中に,条件式を記述することができます。

例えば,先ほどから使用しているサンプルのXMLドキュメントツリーの中から,「nameエレメントのテキストが,『あんぱん』の物」を指定したい場合には,

trace(xml.item.(name=="あんぱん"));

と,コードを記述します(図8)。

図8●条件式を使って任意のエレメントを抽出する
図8●条件式を使って任意のエレメントを抽出する
[画像のクリックで拡大表示]

また,条件式を満たす物が複数ある場合には,結果はXMLListの形式で返ってきます。例えば,「id要素の値が『2』以上のもの」という条件式の結果は,次のようになります。

trace(xml.item.(@id>=2"));
図9●条件を満たすエレメントをリストで抽出する
図9●条件を満たすエレメントをリストで抽出する

エレメントを指定する式の途中に条件式を挟み,任意のエレメントを取得することも可能です。例えば,「nameの値が『あんぱん』であるitemエレメントのpriceの値」を取得したい場合には,次のようにコードを記述します。

trace(xml.item.(name=="あんぱん").price);
図10●条件式を途中に挟んでエレメントを取得する
図10●条件式を途中に挟んでエレメントを取得する

このように,「( )」内に条件式を記述することで,任意のエレメントのリストを抽出したり,取得したりといった処理が簡単にできるようになっています。

今回は,ActionScript3.0で,XML形式のデータを扱うための基礎をご紹介しました。次回は一歩踏み込んで,実際に使う機 会の多い,Webサービスとの連携や,その際に知っておきたい名前空間(namespace)へのアクセス方法をご紹介します。お楽しみに。

moto

http://itpro.nikkeibp.co.jp/article/COLUMN/20080507/300850/?ST=swd-tech&P=3