Hatena::ブログ(Diary)

プログラミングとかそんなの このページをアンテナに追加 RSSフィード

カレンダー
2004 | 08 | 09 | 10 | 11 | 12 |
2007 | 09 | 10 | 11 |
2008 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 |
2011 | 12 |

2007-10-04 AS3のXML名前空間で嵌まる

[][] AS3XML名前空間で嵌まる

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>MSZuneモデル発表、フラッシュメモリ版も</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はそれぞれ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文書を厳密に扱う場合の嵌まりポイントなわけだが、今回も見事に嵌まった。

自分にお疲れって感じだろうか。。。