«

»

7月 23

iPhoneでWebAPIを活用する


最近はiPhoneアプリ開発にかなり注力していますが、その前はWebアプリケーション作ったり、WebAPIを使ったWordPressプラグインを作ったり(公式に公開してるものではないですが)していたのでふとiPhoneでもWebAPIが使えればなぁと思って調べてたら案の定ありました。

どうもiPhoneだと libxml2 というライブラリを使う方法と NSXMLParser というクラスを使う方法の2種類があるみたいです。

libxml2 はどうやら元はCのライブラリ(?)のようでCが大変苦手な自分にとってはちょっと取っ付きにくかったです。
でもCだけあって速度はNSXMLParserに比べて高速という利点があるようです。

ただ、NSXMLParserはもともとiPhone開発用のライブラリの中に入っているしObject-Cで書けるので使い易いということでひとまずNSXMLParserを使ってみることにしました。

うまく設計してXMLパーサ部分を疎な状態にして作れれば後々 libxml2 化も容易にできてアプリ開発を先に進める上ではいいのではと勝手に妄想してます(笑)

で、肝心の使い方ですが、以下のような感じ

- (void)parseRSSData:(NSURL *)url {</pre>
items = [[NSMutableArray alloc] initWithCapacity:0];

 parser = [[NSXMLParser alloc] initWithContentsOfURL:url];
 [parser setDelegate:self];
 [parser parse];
}

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *) qualifiedName attributes:(NSDictionary *)attributeDict {
 if ([elementName isEqualToString:@"Item"]) {
 //currentItem = [[Item alloc] init];
 dictionary = [[NSMutableDictionary alloc] init];
 } else if (dictionary) {
 currentNodeName = [elementName copy];
 currentNodeContent = [[NSMutableString alloc] initWithCapacity:0];
 }
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
 if ([elementName isEqualToString:@"Item"]) {
 [items addObject:dictionary];

 [dictionary release];
 dictionary = nil;
 } else if ([elementName isEqualToString:currentNodeName]) {
 [dictionary setObject:currentNodeContent forKey:elementName];

 [currentNodeName release];
 currentNodeName = nil;
 [currentNodeContent release];
 currentNodeContent = nil;
 }
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
 [currentNodeContent appendString:string];
}

- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError {
}

parseDataに対してNSURLを引数に渡すと、NSXMLParser のインスタンスを作成して自分自身のクラスをデリゲートの対象としてXMLのパースを行います。

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *) qualifiedName attributes:(NSDictionary *)attributeDict

そして上記の関数がタグの開始時に呼ばれるので関数の中で検出したいタグを文字列比較で検知しています。 この例の場合では Item タグに反応するように作っています。

Item タグの場合には NSMutableDictionary のインスタンスを作成してその子要素のタグの内容を格納するための箱を作成します。

それ以外のタグの場合には開始タグ名を変数に記憶しておき、後で説明する閉じタグの検出時に呼ばれる関数内で目的のタグが閉じられたことを検出して NSMutableDictionary の中にタグ名をキーとして値を放りこみます。

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName

上記の関数は閉じタグの検出時に呼ばれるデリゲート関数です。

先ほどの説明で書いたように Item の子要素の閉じタグを検出した場合には NSMutableDictionary に値を入れ、 Item が閉じられた場合には配列にItemの内容をまとめた NSMutableDictionary のインスタンスを入れて、そのインスタンスを release して nil を入れて空にしておき、また Item を入れるための準備をします。

あとは解析されたデータをテーブル表示するなりなんなりすれば良い、という感じです。

コメントをどうぞ

メールアドレスは公開されません

次の HTMLタグおよび属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

edited by