2011/11/28更新

[XCODE] XMLをパースする方法

このエントリーをはてなブックマークに追加            

こんにちは、@yoheiMuneです。
今日は、iPhoneアプリで、RSSなどのXMLを読み込む(パースする)方法を学んだので、ブログに残しておきたいと思います。

画像



XMLをパースする2つの方法

XMLをパースする方法には、以下2つがあるようです。
そのうちXCODEがサポートしているのは、Event-driven APIという方法です。

■ Tree Base API
 XMLがTree型のデータ構造である点から、XPathなどの記述を用いて対象のノードを特定する方法。 HTML上のJavaScriptにおけるDOM操作など多くの言語でサポートされているAPI。

■ Event-driven API
 XMLを読み込む際に、エレメントの開始や終了など、読み込んだイベント毎に反応して、要素の抽出などを行う方法。
 以下のサンプルXMLを読み込むと以下のような、イベントが発生します。
<?xml version= "1.0" encoding="UTF8">
<article author="John Doe">
  <para>This is a very short article.</para>
</article>
 1. Started parsing document
 2. Found start tag for element article
 3. Found attribute author of element article, value “John Doe”
 4. Found start tag for element para
 5. Found characters This is a very short article.
 6. Found end tag for element para
 7. Found end tag for element article
 8. Ended parsing document





Event-driven APIで特に注目すべき3つのメソッド

XMLの要素の読み込み毎に、以下のデリゲードメソッドが呼び出されます。
これらメソッドを用いて、XMLの中身を読み込んで行きます。

■parser:didStartElement:namespaceURI:qualifiedName:attributes:
 エレメントの読み込み開始時のイベント

■parser:foundCharacters:
 エレメントに挟まれた文字列要素を読み込んだ際のイベント

■parser:didEndElement:namespaceURI:qualifiedName:
 エレメントの読み込み終了時のイベント




実際にXMLを読み込んでみる

まずは、以下のような処理でXML読み込みを開始します。
// 読み込み対象XMLのパスを指定する。ここでは、iTunesの人気曲ランキングのRSSです。
NSURL *url = [NSURL URLWithString:@"http://itunes.apple.com/jp/rss/topsongs/limit=5/xml"];

// NSXMLParserクラスのインスタンスを作成する。
NSXMLParser *p = [[NSXMLParser alloc] initWithContentsOfURL:url];

// Event-drivenな読み込み時に呼び出すデリゲードクラスを指定する。
// selfのクラスは、NSXMLParserDelegateプロトコルの実装を宣言しておく。
p.delegate = self;

// XMLの読み込みを開始する。
[p parse];


読み込みを開始したら、読み込みイベント毎にメソッドが呼び出されるので、そのメソッド実装します。
ここでは、読み込まれたエレメント名や文字列をコンソールに出力します。

■エレメントの読み込み開始時のイベント
- (void)parser:(NSXMLParser *)parser
didStartElement:(NSString *)elementName
  namespaceURI:(NSString *)namespaceURI
 qualifiedName:(NSString *)qualifiedName
    attributes:(NSDictionary *)attributeDict {
   
    if ([elementName isEqualToString:@"feed"]) {
     NSLog(@"RSSの読み込み開始");
   
    } else if ([elementName isEqualToString:@"entry"]) {
     NSLog(@"Entryの読み込み開始。ここから曲の詳細情報を取得する。");
   
    } else if ([elementName isEqualToString:@"id"]) {
     NSLog(@"id読み込み開始");

    } else if ([elementName isEqualToString:@"title"]) {
     NSLog(@"title読み込み開始");
  
    // その他、必要に応じて if文を追加する。
    }   
}

■エレメントに挟まれた文字列要素を読み込んだ際のイベント
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
  NSLog(@"string");
}

■エレメントの読み込み終了時のイベント
- (void)parser:(NSXMLParser *)parser 
 didEndElement:(NSString *)elementName 
  namespaceURI:(NSString *)namespaceURI 
 qualifiedName:(NSString *)qName {

    if ([elementName isEqualToString:@"feed"]) {
     NSLog(@"RSSの読み込み終了");
   
    } else if ([elementName isEqualToString:@"entry"]) {
     NSLog(@"Entryの読み込み終了。");
   
    } else if ([elementName isEqualToString:@"id"]) {
     NSLog(@"id読み込み終了");
    } else if ([elementName isEqualToString:@"title"]) {
     NSLog(@"title読み込み終了");
  
    // その他、必要に応じて if文を追加する。
    }   
}




参考資料

以下を参考にさせて頂きました。ありがとうございます(^ー^)ノ
Event-Driven XML Programming Guide




最後に

XMLを自由自在にパース出来るようになると、外部システムとのデータやりとりなどスムーズに出来るようになってイイですね(*´∇`*)
もっともっと色々と学んで、iPhoneアプリを自由に作れるようになれば良いな。






こんな記事もいかがですか?

RSS画像

もしご興味をお持ち頂けましたら、ぜひRSSへの登録をお願い致します。