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

ActionScript 3.0ではXMLの扱い方がAS2.0までとはちょっと変わっているようなので、その内容を把握すると同時に、いろいろ勉強し直してみます。

AS3のXML実装

ヘルプによると、ActionScript 2.0のXMLクラスと関連クラスは XMLDocumentという名前に変わり、これは後方互換性を維持するためだけにflash.xmlパッケージに残っている、とのことらしい。
AS3.0的では、E4X(ECMAScript for XML)準拠のクラスとして、XML、XMLList、QName、Namespaceクラスがトップレベルに置かれていますが、最初はXMLと、XMLListだけでいろいろ出来るので、これらからいろいろ試してみたいと思います。

XMLオブジェクトを生成

AS3.0ではXMLリテラルが追加されたので、次のようなコードを書くことが出来ます。

// Example 1A
var aXML:XML	=
  <data id='123' color='blue'>
    <!-- this is a comment -->
    <number>21</number>
    <number>22</number>
  </data>;

これはXMLリテラルであり、文字列ではないことに注意してください。
しかし、文字列からもXMLオブジェクトは生成することが出来るので、次のようなコードも Example 1A と同様のオブジェクトを生成します。

// Example 1B
var aXMLString:String	= "\
  <data id='123' color='blue'>\
    <!-- this is a comment -->\
    <number>21</number>\
    <number>22</number>\
  </data>";
var aXML:XML	= new XML( aXMLString );

このように様々な方法で作成されたXMLの内容を確認してみたいと思います。
XML.toXMLString() という文字列に変換する便利な関数が用意されていますので、これを試してみます。
上記 Example 1B の aXML を出力したときは次のようになりました。

trace( aXML.toXMLString() );
[trace] <data id="123" color="blue">
[trace]   <number>21</number>
[trace]   <number>22</number>
[trace] </data>

出力時のXMLエレメントのアトリビュートがダブルクォーテーション括りになっていることなどから、XMLオブジェクトに渡した文字列をそのまま出力しているのではなく、一度XMLデータとして解釈されたものが整形出力されていることが分かります。
(もう一つXML.toString()という関数があるのですが、XMLの内容を正確に知ることを優先するので、このエントリでは無視します)

XMLオブジェクトにデータを追加してみる

読み込んだXMLデータに、コード側でデータを追加してみる方法は簡単で prependChild/appendChild を使います。

// Example 2
var aXMLString:String	= "\
  <data id='123' color='blue'>\
    <!-- this is a comment -->\
    <number>21</number>\
    <number>22</number>\
  </data>";
var aXML:XML	= new XML( aXMLString );
aXML.appendChild( <hoge>APPEND HIP!</hoge> );
aXML.prependChild( <hoge>PREPEND HEAD!</hoge> );

試しに書いた上記コードは以下のように動作します。

trace( aXML.toXMLString() );
[trace] <data id="123" color="blue">
[trace]   <hoge>PREPEND HEAD!</hoge>
[trace]   <number>21</number>
[trace]   <number>22</number>
[trace]   <hoge>APPEND HIP!</hoge>
[trace] </data>

以上のように新しいインターフェイスを使うと簡単にXMLオブジェクトを構築することが確認できました。

次はこのXMLオブジェクトをいろいろ読み込んだり操作したりするのですが、それは別のエントリでアップします。

(つづく)