2007-10-17

Flex2+AS3.0>XMLの操作1

前置き

XMLについてはTECHSCORE > XMLをざっと斜め読み程度の知識。
前に講習でスキーマとかXPathとかやった気もするけど忘れた。
AS3.0のXML操作は以下を参考にした。
Livedocs:Flash CS3ドキュメント > ActionScript3.0のプログラミング > XMLの操作
Flash ActionScript3.0入門ノート:演算子>XML演算子の項


XMLとXMLList

ぼんやり分かってた気がしたのですが、日本語にしようとすると訳わかんなくなる。
XML一個の要素(と属性)。要素には子も含まれるが、子がいればXMLList。一つのルート要素。
XMLList複数のXML。複数のルート要素。
という認識。勘違いしている気もするが、とりあえず進む。

XMLサンプル

public var myXML:XML =
<favorite>
<album>
<title>Panoption</title>
<artist origin="USA">ISIS<category>post-rock</category></artist>
<year>2004</year>
<track>
<song tracknumber="1" length="7:30">So Did We</song>
<song tracknumber="2" length="7:43">Backlit</song>
<song tracknumber="3" length="8:53">In Fiction</song>
<song tracknumber="4" length="6:47">Wills Dissolve</song>
<song tracknumber="5" length="9:39">Syndic Calls</song>
<song tracknumber="6" length="9:57">Altered Course</song>
<song tracknumber="7" length="8:27">Grinning Mouths</song>
</track>
</album>
<album>
<title>A Time of Day</title>
<artist origin="Sweden">Anekdoten</artist>
<year>2007</year>
<track>
<song tracknumber="1" length="6:22">The Great Unknown</song>
<song tracknumber="2" length="7:13">30 Pieces</song>
<song tracknumber="3" length="5:02">King Oblivion</song>
<song tracknumber="4" length="6:29">A Sky About To Rain</song>
<song tracknumber="5" length="3:06">Every Step I Take</song>
<song tracknumber="6" length="4:29">Stardust And Sand</song>
<song tracknumber="7" length="6:47">In For A Ride</song>
<song tracknumber="8" length="5:20">Prince Of The Ocean</song>
</track>
</album>
</favorite>

. と ..

.(演算子)子へのアクセス、..(アクセサ演算子)は階層の深さを無視してアクセス出来る。
実行>
trace(myXML.album.title.toXMLString());
trace(myXML..title.toXMLString());         // albumを省略

結果>
<title>Panoption</title>
<title>A Time of Day</title>

<title>Panoption</title>
<title>A Time of Day</title>
※ふとmyXML.favorite.album.titleじゃないの?と思ってやってみたらダメだった。なんで?

子が1つの場合は[]インデックス参照は省略可

ただし、子が複数居れば列挙になる。
実行>
trace(myXML.album[0].title.toXMLString());   // titleは一つだけなので省略
trace(myXML.album.title.toXMLString());      // albumは一つではないので列挙

結果>
<title>Panoption</title>
 
<title>Panoption</title>
<title>A Time of Day</title>


属性へのアクセス

属性にアクセスするには、@演算子を使う。
実行>
trace(myXML.album[0].track.song[0].@length.toXMLString());   // length属性
trace(myXML.album[1].track.song[0].@*.toXMLString());        // 全属性

結果>
7:30

1
6:22


()によるフィルタ処理

()を使って要素内容または属性値を指定してフィルタ処理できる。
実行>
trace(myXML..song.(@length > "9:00").toXMLString());      // 9分以上の大作!

結果>
<song tracknumber="5" length="9:39">Syndic Calls</song>
<song tracknumber="6" length="9:57">Altered Course</song>
なんとなく出来そうな気がして「時間」でフィルタかけたら出来た、すげぇ。

要素内容の場合は
実行>
trace(myXML..album.(title == "A Time of Day").artist.toXMLString());
 
結果>
<artist origin="Sweden">Anekdoten</artist>


toXMLString()とtoString()

違いがわかりません。
と思ったけどFlex2のヘルプに記述があった。

まとめると、以下の通り。

toXMLString()はタグ、属性、名前空間を含む内容。
実行>
trace(myXML..album[0].artist.toXMLString());

結果>
<artist origin="Sweden">Anekdoten</artist>

toString()は内容。
実行>
trace(myXML..album[1].artist.toString());

結果>
Anekdoten

ただし、子が居る場合はtoXMLString()と同じ結果になる。
実行>
trace(myXML..album[0].artist.toString());

結果>
<artist origin="USA"> 
  ISIS
  <category>post-rock</category>
</artist>
※この場合<category></category>が子。
つまり、XMLListオブジェクトではなく、XMLオブジェクトの場合、toString()が有効。 …って認識で合ってるかな、多分。

うーむ、とりえずこんなもんで先進もう。

ソース

XMLTest.as(※Unicode(UTF-8))

メモ

要素=エレメント
要素内容=エレメント名
属性=アトリビュート
アクセサ=Javaのメソッド、C#のプロパティと同義?
メンバー変数に変更を加えるのに自動的に追加されるset/getメソッド な仕組みの事?
どうやらこれをアクセサメソッドと呼ぶらしい。
posted by travis at 18:49 | Comment(0) | TrackBack(0) | Flex2+AS3.0
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

この広告は1年以上新しい記事の投稿がないブログに表示されております。