« Flex2のDataGridにXMLデータをバインドする | トップページ | Flex2でStyleを適用する »

2006年7月28日 (金)

Flex2のDataGridにXMLデータをバインドする Part2

今日は、このブログの 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;
と記述してあるので最初はこのようにやってみたのですが、実行時エラーとなり動作しませんでした。
何か書き間違えていたのかもしれませんが、私もまだ理解していない部分が多く、理由はよくわかりませんでした。

|

« Flex2のDataGridにXMLデータをバインドする | トップページ | Flex2でStyleを適用する »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/12438/11126129

この記事へのトラックバック一覧です: Flex2のDataGridにXMLデータをバインドする Part2:

« Flex2のDataGridにXMLデータをバインドする | トップページ | Flex2でStyleを適用する »