今日は、このブログの Atom Feed を URLLoader を使って取得するサンプルを載せておきます。
が、もっと良い方法があるような気がします。
サンプルページ
<mx:Script>
<![CDATA[
import flash.events.*;
import flash.net.*;
private function getAtomFeed() : void
{
var loader:URLLoader = new URLLoader();
var request:URLRequest = new URLRequest("/web/atom.xml");
loader.addEventListener(Event.COMPLETE, loaderCompleted);
loader.load(request);
}
private function loaderCompleted(event:Event) : void
{
namespace ns = "http://www.w3.org/2005/Atom";
use namespace ns;
var loader:URLLoader = URLLoader(event.target);
var data:XML = new XML(loader.data);
var ns2:Namespace = new Namespace("http://www.w3.org/1999/xhtml");
var entries:Array = new Array();
for(var i:uint=0;i<data.entry.length();i++){
entries.push(
{
title : data.entry[i].title,
published : data.entry[i].published,
content : data.entry[i].content.ns2::div.toXMLString()
}
);
}
this.grid.dataProvider = entries;
}
]]>
</mx:Script>
<mx:DataGrid id="grid" width="400">
<mx:columns>
<mx:DataGridColumn dataField="title" headerText="題名" width="300" />
<mx:DataGridColumn dataField="published" headerText="公開日" width="100" />
</mx:columns>
</mx:DataGrid>
<mx:Button label="データを取得" click="getAtomFeed();" />
<mx:Box height="300" borderStyle="solid"
verticalScrollPolicy="auto" backgroundColor="0xFFFFFF">
<mx:Text id="view" width="700" height="100%"
htmlText="{grid.selectedItem.content}" />
</mx:Box>
URLLoaderは、load メソッドに URLRequest を渡すことでデータをロード出来ます。
データの取得が完了したら complete イベントが発生するのでイベントリスナーを登録しておいて処理します。
ダウンロードしたデータは、event.data から取得できます。
ここまでは特に問題はないと思いますが、取得した Atom Feed を取り扱う時に躓いてしまいそうです。
Atom Feed のルートノードは、
<feed xmlns="http://www.w3.org/2005/Atom">
という具合に名前空間で修飾されていて、単純に data.entry と記述してもうまくいきません。
この場合は、
var ns : Namespace = new Namespace("http://www.w3.org/2005/Atom");
data.ns::entry[0].ns::author ......
という具合にNamespaceクラスを使う必要があります。
しかし、これだとちょっと見辛くなってしまいますよね。
そこで、
namespace ns = "http://www.w3.org/2005/Atom";
use namespace ns;
data.entry[0].author .........
のように、事前に http://www.w3.org/2005/Atom という URI の名前空間を使用することを宣言しておくと、
スッキリ書けます。
Namespaceのドキュメントには、RSS Feed を取得するサンプルが書いてあり、そこでは、
var rss:Namespace = new Namespace("http://purl.org/rss/1.0/");
.....
default xml namespace = rss;
と記述してあるので最初はこのようにやってみたのですが、実行時エラーとなり動作しませんでした。
何か書き間違えていたのかもしれませんが、私もまだ理解していない部分が多く、理由はよくわかりませんでした。