XMLをパースする

iPhoneXMLを扱う際には、使いたいCocoaXML関連クラスがiPhone上で使えるかどうかにまずは注意しましょう。

例えば、NSXMLDocumentやNSXMLElementといった、NSXMLNodeのサブクラスは、iPhone Simulator上では使えますが、iPhoneの実機では使えません。

シミュレータで開発を続けていて、いざ実機で動かそうとしてコンパイルが通らない!という段階になってから気づく...といった事態に陥らないためにも、注意が必要です。

逆にiPhone上で使えるのは、NSXMLParserクラス。

NSXMLParserのサンプルとしては、SeismicXMLというのがありますが、ちょっと複雑すぎます。その辺、うまくまとめたのが、このチュートリアルです。

http://blog.atrexis.com/index.cfm/2008/7/28/iPhone--Parse-XML-to-custom-objects

ちょっとだけ直したのを、プロジェクトとしてまとめて公開しておきます。このblogのRSSを取得して、Table Viewに表示するというもの。

RSSReaderチュートリアル

上のチュートリアルの方法のポイントは、パースして取り出したいXMLノードの名前と同じクラス(NSObjectのサブクラス)をコンテナとして用意しておくとろこです。そして、NSXMLParserのdelegateメソッドの中で、そのクラスと同じ名前のノードが来たところで、オブジェクトを生成。ノードの中身は、そのオブジェクトのインスタンス変数として、Key-Value Codingで格納します。このときも、インスタンス変数の名前を、ノードの要素の名前と一致させることで単純化しています。

RSSの場合、各エントリーはitemというノードなので、Itemというクラスを作っています。
また、エントリーのタイトルは、titleなので、Itemクラスの中にtitleというインスタンス変数を持たせてます。

もともとのチュートリアルに対して変更を加えた点は、下の二点。

1. クラスの名前とノードの名前を比較するときに、クラスの名前を小文字に変換している。

クラスの名前は大文字からはじめる慣習なので。case-insensitiveな比較をしてもいいでしょう。


2. コンテナとなるオブジェクトに- (void)setValue:(id)value forUndefinedKey:(NSString *)keyを実装 (中身はからっぽ)

これを省くとすべての要素に対して対応するインスタンス変数を用意しないと、NSUndefinedKeyExceptionが発生します。そこで空の実装でオーバーライドしておきます。

以上、簡単ですが、お役に立てば幸いです!