Flickr の個人アカウントページにある RSS Feed(RSS 2.0)は api.flickr.com 上に置かれており、http://api.flickr.com/crossdomain.xml で確認できるように、<allow-access-from domain="*"/> 設定なので、別サーバからでも crossdomain 問題を回避してこの XML を Flash 内で利用できる。Flickr では便利な API が準備されているので特に RSS を使用しなくても様々な事ができるが、簡単にブログパーツを作る際などはこの RSS が結構便利。
ということで、これを ActionScript 2.0 で解析し、同様な事を ActionScript 3.0 で行った。
サンプルの RSS Feed は下記の自分のモノを利用した。今回は、この RSS の構造から各 item ノード内のノード値と media:text ノード内のノード値を取得してみる。

Flickr account screenshot
ActionScript 2.0(以下、AS 2.0) ではこの解析はすんなり行うことができる。
AS 2.0 の解析プログラムの例は以下の通りである。
【サンプルファイル】
download AS 2.0 file
stop();
// 初期設定
var path:String = "http://api.flickr.com/services/feeds/photos_public.gne?id=53418554@N00&
format=rss_200";
var xmlObj:XML = new XML();
xmlObj.ignoreWhite = true;
function parseXML(xml:XML):Void {
var mainNode:XMLNode = xml.firstChild.firstChild;
var channelNodesNum:Number = mainNode.childNodes.length;
for(var i:Number = 0; i < channelNodesNum; i ++) {
if(mainNode.childNodes[i].nodeName.toLowerCase() == "item") {
var itemNodesNum:Number = mainNode.childNodes[i].childNodes.length;
for(var j:Number = 0; j < itemNodesNum; j ++) {
if(mainNode.childNodes[i].childNodes[j].nodeName.toLowerCase() == "link") {
// link ノード のノード値取得
var linkNodeValue:String =
mainNode.childNodes[i].childNodes[j].firstChild.nodeValue;
trace(linkNodeValue);
}
if(mainNode.childNodes[i].childNodes[j].nodeName.toLowerCase() == "media:text") {
// media:text ノード のノード値取得
var mediaNodeValue:String =
mainNode.childNodes[i].childNodes[j].firstChild.nodeValue;
trace(mediaNodeValue);
}
}
}
}
}
xmlObj.onLoad = function(success:Boolean):Void {
if(success) {
parseXML(this);
} else {
trace("XML 解析エラー");
}
}
xmlObj.load(path);
しかしながら E4X に完全準拠した ActionScript 3.0 (以下、AS 3.0)では上記の様に単純に media:text をノード名に見立てて RSS を解析することは出来ない。なぜなら、AS 3.0 では名前空間という概念を含んでおりmedia:text は media という名前空間に属しているとみなされ、同様に、media:content、media:title、media:thumbnail、media:credit、media:category 等も同じ名前空間に属しているためである。
名前空間を使用した要素名・属性名の書き方
名前空間の識別子:要素名
名前空間の識別子:属性名
そのため、まず、取得したいノードがどの名前空間に属しているか設定する必要がある。
今回は media:text は media という名前空間の text という要素名なので、これを E4X に基づいて記述する。link ノードのノード値に関しては通常の E4X の RSS 解析で簡単に取得できる。
AS 3.0 の解析プログラムの例は以下の通りである。
【サンプルファイル】
download AS 3.0 file
stop();
// クラスファイル読み込み
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.xml.XML;
import flash.events.*;
import flash.error.*;
// URLLoader 設定
var ULoader:URLLoader = new URLLoader();
configureListeners(ULoader);
function configureListeners(dispatcher:IEventDispatcher):void {
dispatcher.addEventListener(Event.COMPLETE, completeHandler);
}
// complete イベントハンドラ 設定
function completeHandler(event:Event):void {
var xmlObj:XML = new XML(ULoader.data);
var nodeNum:Number = xmlObj..item.length();
for(var i:Number = 0; i < nodeNum; i ++) {
// link のノード値取得
var linkNodeValue:String = xmlObj..item[i].link.text();
trace(linkNodeValue);
// media:text のノード値取得
var ns:Namespace = xmlObj..item[i].namespace("media");
var mediaNodeValue:String = xmlObj..item[i].ns::text;
trace(mediaNodeValue);
}
}
// URLRequest 設定
var path:String = "http://api.flickr.com/services/feeds/photos_public.gne?id=53418554@N00&
format=rss_200";
var URequest:URLRequest = new URLRequest();
URequest.url = path;
try {
ULoader.load(URequest);
} catch(e) {
trace(e.message);
}
まず、AS 3.0 では複数ある item ノードを childNodes などを使わず、「..」を使用することにより Array として取得できる。(元の XML オブジェクト)..item で簡単に取得可能。その Array の length は(元の XML オブジェクト)..item.length である。また、item ノードの子ノードである media:text は namespace 関数によって名前空間を取得し、「::」でその要素名を特定できる。そのため、(元の XML オブジェクト)..item[incrementの数].namespace("名前空間")::要素名、つまり、(元の XML オブジェクト)..item[incrementの数].namespace("media")::text で取得できる。
E4X 準拠の XML 解析は最初は多少戸惑ったが、仕様さえ理解すれば AS 2.0 より数倍簡単に解析できてしまう事が素晴らしい!また他の言語でも E4X に準拠していく流れからすると、ActionScript 単体で完結するのではなく、他の言語に応用できるのが個人的には無駄が無く納得した。なお、今回は説明中心のため、あえて link と media:text を取得して trace だけしているが、この情報を Array に格納して
Flash 内で表示さえさせればブログパーツは簡単にできてしまう。また、media:text もしくは description のノード値はコレだけでは使えないのでさらに String を解析するし必要な部分を取得する必要がある。ここでも AS 2.0 と AS 3.0 では処理的に大きな違いがある。何故なら AS 3.0 から正規表現が使えるようになり、より効率よくなっているからである。次はここについて説明しようと思う。
最後に RSS 2.0 が面倒な場合は Feed URL の最後の「&format=rss_200」を消してしまえばよりシンプルな形になるのでこっちを解析した方が多少楽。
【使用環境】
Flash 8 Professional、Flash 9 Public Alpha