前回は,iPhoneアプリケーション開発を解説するにあたり必要な,オブジェクトの基本知識や開発の流れを紹介した。今回は,アプリケーションの実装に入っていこう。今回紹介するのは,RSSを読み込み,パースしてその一覧をテーブル内に表示する,という機能だ。

 パース・データとしてRSSを例に説明しているが,内容としてはXML全般に適用できる話である。XMLでのWebアプリケーション連携を考える際には役に立つだろう。

iPhoneのXMLパーサー

 iPhoneには,近年の様々なスクリプト言語に見られる,全自動でオブジェクト化を行ってくれるような強力なXMLパーサーは搭載されていない。だが,単純にXMLタグをパースしていくだけの単純なものであれば,2通りの選択肢がある。

・libxml2 ライブラリ
・NSXMLParser オブジェクト

 libxmlライブラリは,Linuxでよく知られた高機能なXMLパース・ライブラリで,多くのプラットフォームに移植され利用されている。スクリプト言語などで実装されているXML処理系でも,このlibxmlをラッピングしたり,内部的に利用したりしているものが多い。特徴としては,実績があり高機能であること,高速であることなどが挙げられる。

 デメリットとしては,C言語のAPIであるためiPhone内で利用するためにはObjective-Cのオブジェクトを適切に渡すためのラッピング・オブジェクトを改めて作成しなければならないという面倒さがある。

 それに対して,NSXMLPerserは,Objective-C用のAPIとしてiPhoneで提供されるFoundationフレームワーク内に用意されているXMLのパーサー・オブジェクトだ。内部的にはlibxmlを利用している。言ってみれば,libxmlのよく使いそうな機能をObjective-Cでうまく使えるようにラッピングしておいたもの,といったところだ。

 厄介な部分を吸収してくれる代わりに,Objective-Cのオブジェクトをあれこれ生成したりするので,やはりlibxmlをそのまま使うよりもだいぶ遅くなってしまう傾向がある。

 これらの特性を比較すると,「手軽に済ませたい」「一つひとつのXMLの規模があまり巨大ではない」というような場合にはNSXMLParserを,大量のXML処理を行い,その重さがアプリケーションの性能に影響を及ぼすような規模になるようなら,libxmlを使って自前のXMLオブジェクト実装を,といった使い分けをするとよいだろう。

 ここでは,その手軽さの面からNSXMLParserを使った実装を紹介していく。

NSXMLParserを使ったRSSパーサーの実装

 RSSパーサーの実装の仕組みとしては,
・独自のRSSパーサー・オブジェクトを作成し,NSXMLParserの処理を委譲(delegate)する形でパーサーを実装
・RSSの内容を個別に格納するItemオブジェクトを作成し,パース結果をオブジェクトとして保持
という形になるようにし,RSSの内容がItemオブジェクトの配列として取得できるようなパブリック・メソッドを実装する。

 さて,まずはパース対象となるRSSの例として,ITproトップページのRSSを見てみよう。

http://itpro.nikkeibp.co.jp/rss/ITpro.rdf

 先頭部分のセクション内にリソースへのURLなどが掲載されているが,RSSの実際の記事はの下にセクションとしていくつも並んでいるのが分かるだろう。


<item rdf:about="http://itpro.nikkeibp.co.jp/article/NEWS/20090821/335843/">
<title>しんきん共同システム運営機構,2010年1月に4信金のメインフレームを集約(ニュース)</title>
<link>http://itpro.nikkeibp.co.jp/article/NEWS/20090821/335843/</link>
<description>しんきん共同システム運営機構は2010年1月,新湊信用金庫,大阪信用金庫,摂津水都信用金庫,徳島信用金庫の勘定系システムが動作する富士通製メインフレームを集約する。</description>
<dc:date>2009-08-21T19:27:00+09:00</dc:date>
</item>
RSSデータ(ITpro.rdf)の抜粋

この部分にある
・title
・link
・description
・dc:date
が,RSSパーサーで取得すべきデータとなる。これを元にパーサーの実装に取り掛かろう。

 最初に,RSSParserとItemいう名前で,新たに二つのNSObjectサブクラスを作成していく。これらはそれぞれ,RSSのパーサーを実装するオブジェクトと,RSSデータ一つ一つの内容を格納するオブジェクトである。