XMLを使ってみる(その3)

外部ファイルからXMLを取得して表示

外部ファイルからXMLデータをロードしてみたいと思います。

外部ファイルからXMLデータをロードするには、次のようにURLLoaderクラスを使用します。
いつものように、TestXMLというテストswfを作成して、FlexSDKでビルドします。その時に使用しているコンフィグファイル(TestXML-config.xml)を読み込んで表示してみます。

/* TestXML.as */
package {
  import flash.display.Sprite;
  import flash.events.Event;
  import flash.net.URLLoader;
  import flash.net.URLRequest;
  import flash.xml.*;
  
  public class TestXML extends Sprite
  {
    public var mLoader:URLLoader = new URLLoader();
    public var mRequest:URLRequest = new URLRequest( "./TestXML-config.xml" );
    
    public function TestXML()
    {
      mLoader.addEventListener( Event.COMPLETE, onComplete );
      mLoader.load( mRequest );
    }
    
    public function onComplete( event:Event ):void
    {
      var loader:URLLoader = event.target as URLLoader;
      var xmlRoot:XML = new XML(loader.data);
      
      // 取得したXMLをすべて表示.
      trace( "--- print All ---" );
      trace( xmlRoot.toXMLString() );
      
      trace( "--- print this name ---" );
      trace( xmlRoot.name() );
      
      // next codes.
    }
  }
}

これをビルドして実行したら、以下のように出力されました。

[trace] --- print All ---
[trace] <flex-config>
[trace]   <output>TestXML.swf</output>
[trace]   <default-size>
[trace]     <width>400</width>
[trace]     <height>200</height>
[trace]   </default-size>
[trace]   <default-frame-rate>24</default-frame-rate>
[trace]   <default-background-color>0xFFFFFF</default-background-color>
[trace]   <use-network>false</use-network>
[trace]   <compiler>
[trace]     <debug>true</debug>
[trace]   </compiler>
[trace] </flex-config>
[trace] --- print this name ---
[trace] flex-config

XMLオブジェクトの名前も name() メソッドで出力されているのが確認できます。

XMLオブジェクトの子ノードを出力

上記コードで取得したXMLオブジェクト(xmlRoot)を引き続き走査してみたいと思います。
E4X準拠のXMLクラスセットにはXMLListというクラスがあり、XML.children()で子ノード一覧、XML.child(name)で指定名のノードリストを取得できますので、取得する様子を確認してみます。
上記コードの"// next codes."以下の部分に以下のコードを追加し、ビルドします。

  // 一つ下の子ノードをすべて取得(→XMLList).
  trace( "--- get children ---" );
  var xmlRootChildren:XMLList = xmlRoot.children();
  trace( xmlRootChildren.toXMLString() );
  
  // 一つ下の子ノードを名前で取得(→XMLList).
  trace( "--- get child [output] ---" );
  var xmlOutput:XMLList = xmlRoot.child("output");
  trace( xmlOutput.toXMLString() );
  trace( xmlOutput.toString() );

デバッグ実行を行うと以下のような出力が行われ、望み通りの結果が得られたことが分かります。

[trace] --- get children ---
[trace] <output>TestXML.swf</output>
[trace] <default-size>
[trace]   <width>400</width>
[trace]   <height>200</height>
[trace] </default-size>
[trace] <default-frame-rate>24</default-frame-rate>
[trace] <default-background-color>0xFFFFFF</default-background-color>
[trace] <use-network>false</use-network>
[trace] <compiler>
[trace]   <debug>true</debug>
[trace] </compiler>
[trace] --- get child [output] ---
[trace] <output>TestXML.swf</output>
[trace] TestXML.swf

昔のActionScriptで使われていたXMLNodeとかに比べると簡単でわかりやすい表現で助かります。