iPhoneネットワークプログラミング(XMLパース)

このエントリーを含むはてなブックマークはてなブックマーク - iPhoneネットワークプログラミング(XMLパース)

前回とは趣を異にしてiPhoneでXMLの解析をしてみたいと思います。

XMLの解析をするためには、XMLパーサが必要なのですが、大きく分けて2種類のパーサが存在します。それがDOM(Document Object Model)とSAX(Simple API for XML)です。DOMでは、全てのXML情報を一度メモリに読み込み木構造に展開します。それに対してSAXでは、シーケンシャルに情報を読み込んでいきます。雰囲気的にはC言語でいうfgetsとgetcの違いみたいな感じです。

iPhoneではメモリの制約が厳しいため、DOMではメモリ不足が起こる可能性があります。そこで、Cocoa標準のSAXパーサであるNSXMLParserクラスを使用します。

次に、RSSファイルのXMLの構造を見てみましょう。itemタグで囲まれた部分が一つの記事に相当します。ひとつの記事は、タイトル、概要、アドレス、更新日時などの情報から構成されています。

nsxmlparser1

ではNSXMLparserクラスを使って上のXMLを解析していきます。
View-Based ApplicationのViewControllerクラスにプログラムを追加していきます。

sampleViewController.h

@interface sampleViewController : UIViewController
<NSXMLParserDelegate>{
	NSXMLParser * xmlParser;
	NSString * currentElement;
	NSMutableString *currentTitle;
}
@end

sampleViewController.m

- (void)viewDidLoad {
	[super viewDidLoad];
	
	NSURL *xmlURL = [NSURL URLWithString:@"http://feeds.feedburner.com/TheAppleBlog"]; 
	xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:xmlURL]; 
	[xmlParser setDelegate:self]; 
	[xmlParser parse];
}

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName 
	namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName 
	attributes:(NSDictionary *)attributeDict{ 
	currentElement = [elementName copy]; 
	if ([elementName isEqualToString:@"item"]) { 
		currentTitle = [[NSMutableString alloc] init]; 
	} 
} 

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{ 
	if ([currentElement isEqualToString:@"title"]) { 
		[currentTitle appendString:string]; 
	}
} 

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName
	namespaceURI:(NSString *)namespaceURI 
	qualifiedName:(NSString *)qName{ 
	if ([elementName isEqualToString:@"item"]) { 
		NSLog(@"adding story: %@", currentTitle); 
		[currentTitle release];
	} 
} 

viewDidLoadメソッドの中でNSXMLParserのインスタンスを作成し、その初期化処理を行っています。具体的にはRSSのURL登録とデリゲートの設定です。viewDidLoad以下の3つのメソッドがそのデリゲートメソッドになります。

まず一つめのデリゲートメソッドでitemタグの入りを見つけます。itemタグが見つかればタイトルを格納するための文字列領域を確保します。

nsxmlparser2

2つ目のデリゲートメソッドで、実際のXMLファイルの解析をします。今回のプログラムではタイトルの文字列を取得し、currentTitleに繋げていきます。タイトルなどの文字列はサーバから一度に送られてくるわけではなく、分割されて送信されてくるので、このように、iPhone側でappendStringを用いて再構成する必要があります。

最後のデリゲートメソッドは解析終了時にコールされます。
今回のプログラムではここでタイトルを表示しています。

nsxmlparser4

実行してみて、実際にブラウザで見ることが出来るものと
タイトルが一致しているかどうか、確認してみてください。

Leave a Reply

You must be logged in to post a comment.