AS3のXML名前空間で嵌まる

ActionScrip2.0以降ではXMLリテラル型として扱えるので、DOMの操作がそれなりに簡単に記述できる。


var myXML:XML =


<a class="keyword" href="http://d.hatena.ne.jp/keyword/hoge">hoge</a>
fugo


fuga
fugofugo

;

trace(myXML.book[0].title); // hoge
trace(myXML.book.(@id==2).author); //fugofugo

これを踏まえて、RSSフィードからデータを取得を試みたところ、名前空間の扱いで嵌まった。
例として、ITメディアのRSSフィード(RSS1.0)からデータを取得する場合を見てみる。


var feed:XML =



<a class="keyword" href="http://d.hatena.ne.jp/keyword/ITmedia">ITmedia</a> Top Story 最新記事一覧
http://www.itmedia.co.jp/news/fortop/
ITmedia Top Story の最新記事一覧です。
ja
2007-10-04T09:25:00+09:00









<a class="keyword" href="http://d.hatena.ne.jp/keyword/iPhone">iPhone</a>は携帯型「ハッキングプラットフォーム」なのか
http://rss.rssad.jp/rss/artclk/lfgBXSTPJWCW/612d96c099a491843c8f88c5c3fb4988?ul=C8C7clxVQPaato.UY9Mc830eAD9ss4Helxepl.75uJrjoVYBy0jnWHr9K_Q5GjttTQzOcqPHWRHitEVQK_CNpkUJs4vIAYZP27T3pL7M0lM3iAV2pgV94mG_LiKATzR6JTvdKHR
]]>
2007-10-04T05:34:00+09:00


速度・容量・価格、BDメディア3要素の近未来
http://rss.rssad.jp/rss/artclk/lfgBXSTPJWCW/bd955e9aba3fa7583fd545511cc1067b?ul=21sirYpxOs9kU4m0BV4zFczuEbBfwpaejXjy6O3hRewGHdyId3qIpUXqudNvuWvKN6MQ0D0O_v5FbQfMtJ8kZxB7C8rcP.dDx3Jc5ifqrewLwbjqGqPcYC487RsVL2RNPkfZ_R0
年末に向けてBDレコーダーの新製品が数多く出荷される。そうなると気になるのがBDメディアの対応速度/容量/価格だ。CEATECの会場から近未来を探る。



]]>
2007-10-03T18:06:00+09:00


MSが<a class="keyword" href="http://d.hatena.ne.jp/keyword/Zune">Zune</a>新モデル発表、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%E9%A5%C3%A5%B7%A5%E5%A5%E1%A5%E2%A5%EA">フラッシュメモリ</a>版も
http://rss.rssad.jp/rss/artclk/lfgBXSTPJWCW/ee844ccc4eddd18b1cb282976de21b65?ul=vAJEGd7f932XqhM8e7rw_7qyddgAvNv2qY0BtGwznkcBy9VuZdN8uwmhssEqMx71JUHfNEgKaf52IHomFcxSaYXhXzSLvXNg7pGuA0rVQ0srAgqRvLUx07VASr02LJAJdcp14RT
]]>
2007-10-03T13:37:00+09:00
;

trace(feed.item[0].title); // エラー

最初のitemのタイトルを出力しようと試みているが、そんなプロパティは存在しないというようなエラーがでて終了する。
これは、一番外側のRDF要素にて既定名前空間が「http://purl.org/rss/1.0/」に指定されており、アクセスを試みようとしたtitle要素はその名前空間に属していることが原因だ。

したがって、名前空間を正しく指定して要素へアクセスすれば良い。以下のコードは、AS3.0でのみ動作確認をしている。


var ns:Namespace = new Namespace('http://purl.org/rss/1.0/');
trace(feed.ns::item[0].ns::title); // iPhoneは携帯型「ハッキングプラットフォーム」なのか

itemと、titleはそれぞれURIhttp://purl.org/rss/1.0/」の名前空間に属しているのでそれぞれの先頭に「(Namespaceオブジェクト)::」を付ける必要がある。
この記述方法だと「ns::」だらけになり、読みづらいので既定名前空間を書き換える方法も提供されている。


var ns:Namespace = new Namespace('http://purl.org/rss/1.0/');
default xml namespace = ns;
trace(feed.item[0].title); // iPhoneは携帯型「ハッキングプラットフォーム」なのか

XML名前空間は、XML文書を厳密に扱う場合の嵌まりポイントなわけだが、今回も見事に嵌まった。
自分にお疲れって感じだろうか。。。