カレンダー
2007-10-04 AS3のXML名前空間で嵌まる
■[flash][AS3] AS3のXML名前空間で嵌まる
ActionScrip2.0以降ではXMLをリテラル型として扱えるので、DOMの操作がそれなりに簡単に記述できる。
var myXML:XML = <order> <book id="1"> <title>hoge</title> <author>fugo</author> </book> <book id="2"> <title>fuga</title> <author>fugofugo</author> </book> </order>; trace(myXML.book[0].title); // hoge trace(myXML.book.(@id==2).author); //fugofugo
これを踏まえて、RSSフィードからデータを取得を試みたところ、名前空間の扱いで嵌まった。
例として、ITメディアのRSSフィード(RSS1.0)からデータを取得する場合を見てみる。
var feed:XML = <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://purl.org/rss/1.0/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xml:lang="ja"> <channel rdf:about="http://www.itmedia.co.jp/news/fortop/"> <title>ITmedia Top Story 最新記事一覧</title> <link>http://www.itmedia.co.jp/news/fortop/</link> <description>ITmedia Top Story の最新記事一覧です。</description> <dc:language>ja</dc:language> <dc:date>2007-10-04T09:25:00+09:00</dc:date> <items> <rdf:Seq> <rdf:li rdf:resource="http://cgi.itmedia.co.jp/rss/topstory_1.0/www/enterprise/articles/0710/04/news010.html"/> <rdf:li rdf:resource="http://cgi.itmedia.co.jp/rss/topstory_1.0/plusd/lifestyle/articles/0710/03/news075.html"/> <rdf:li rdf:resource="http://cgi.itmedia.co.jp/rss/topstory_1.0/www/news/articles/0710/03/news038.html"/> </rdf:Seq> </items> </channel> <item rdf:about="http://cgi.itmedia.co.jp/rss/topstory_1.0/www/enterprise/articles/0710/04/news010.html"> <title>iPhoneは携帯型「ハッキングプラットフォーム」なのか</title> <link>http://rss.rssad.jp/rss/artclk/lfgBXSTPJWCW/612d96c099a491843c8f88c5c3fb4988?ul=C8C7clxVQPaato.UY9Mc830eAD9ss4Helxepl.75uJrjoVYBy0jnWHr9K_Q5GjttTQzOcqPHWRHitEVQK_CNpkUJs4vIAYZP27T3pL7M0lM3iAV2pgV94mG_LiKATzR6JTvdKHR</link> <description>></description> <dc:date>2007-10-04T05:34:00+09:00</dc:date> </item> <item rdf:about="http://cgi.itmedia.co.jp/rss/topstory_1.0/plusd/lifestyle/articles/0710/03/news075.html"> <title>速度・容量・価格、BDメディア3要素の近未来</title> <link>http://rss.rssad.jp/rss/artclk/lfgBXSTPJWCW/bd955e9aba3fa7583fd545511cc1067b?ul=21sirYpxOs9kU4m0BV4zFczuEbBfwpaejXjy6O3hRewGHdyId3qIpUXqudNvuWvKN6MQ0D0O_v5FbQfMtJ8kZxB7C8rcP.dDx3Jc5ifqrewLwbjqGqPcYC487RsVL2RNPkfZ_R0</link> <description>年末に向けてBDレコーダーの新製品が数多く出荷される。そうなると気になるのがBDメディアの対応速度/容量/価格だ。CEATECの会場から近未来を探る。
![]()
></description> <dc:date>2007-10-03T18:06:00+09:00</dc:date> </item> <item rdf:about="http://cgi.itmedia.co.jp/rss/topstory_1.0/www/news/articles/0710/03/news038.html"> <title>MSがZune新モデル発表、フラッシュメモリ版も</title> <link>http://rss.rssad.jp/rss/artclk/lfgBXSTPJWCW/ee844ccc4eddd18b1cb282976de21b65?ul=vAJEGd7f932XqhM8e7rw_7qyddgAvNv2qY0BtGwznkcBy9VuZdN8uwmhssEqMx71JUHfNEgKaf52IHomFcxSaYXhXzSLvXNg7pGuA0rVQ0srAgqRvLUx07VASr02LJAJdcp14RT</link> <description>></description> <dc:date>2007-10-03T13:37:00+09:00</dc:date> </item> </rdf:RDF>; 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はそれぞれURI「http://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文書を厳密に扱う場合の嵌まりポイントなわけだが、今回も見事に嵌まった。
自分にお疲れって感じだろうか。。。

