Cocoa API解説(macOS/iOS)

iOS , Mac アプリケーション開発のために使われる主要フレームワークの日本語情報です。

目次

NSXMLParserクラス

INDEX>Foundation>

継承 NSObject
準拠 NSObject (NSObject)
フレームワーク /System/Library/Frameworks/Foundation.framework
使用可能 Mac OS X v10.3 以降
  iOS 2.0 以降
定義 NSXMLParser.h

解説

概要

イベント駆動型のXMLパーサーです。順番にXMLデータを読み込みエレメントを順次処理していきます。順次処理していくのでメモリの使用が抑えられます。

パーサーオブジェクトの初期化

パーサーオブジェクトを初期化するには3つ方法があります。それぞれallocで作成して、URLから初期化するメソッド(– initWithContentsOfURL)、データから初期化するメソッド(– initWithData)、インプットストリームから初期化するメソッド(– initWithStream)です。

デリゲートの管理

パーサーで何か発見したときはデリゲートの該当するメソッドが呼び出されます。デリゲートをセットするメソッドは(– setDelegate)で、取得するメソッドは(– delegate)です。

パーサーの挙動を管理する。

名前空間を処理するかどうかを取得するメソッドは(– shouldProcessNamespaces)で、セットするメソッドは(– setShouldProcessNamespaces)です。名前空間プリフィックスを処理する稼働かを取得するメソッドは(– shouldReportNamespacePrefixes)で、セットするメソッドは(– setShouldReportNamespacePrefixes)です。
外部エンティティの報告をするかどうかを取得するメソッドは(– shouldResolveExternalEntities)で、セットするメソッドは(– setShouldResolveExternalEntities)です。

パース

パース(解析)を開始するには(– parse)メソッドを使用します。途中でパースを停止するには(– abortParsing)メソッドを使用します。パーサーのエラーを取得するには(– parserError)メソッドを使用します。

パーサー状態の取得

レシーバが処理している行番号を得るには(– lineNumber)メソッドを使用します。列番号を得るには(– columnNumber)メソッドを使用します。外部エントリーのパブリック識別子を得るには(– publicID)メソッドを使用します。外部エントリーのシステム識別子を得るには(– systemID)メソッドを使用します。ともにエラー発生後に利用可能です。

iTunesトップアルバムのRSSからタイトルを取得する(NSXMLParserのサブクラスとしてITunesXMLParserというクラスを作っています。)

#pragma mark initWithContentsOfURL
-(void)method002
{
    NSURL *aURL = [NSURL URLWithString:@"http://itunes.apple.com/jp/rss/topalbums/limit=10/explicit=true/xml"];
    ITunesXMLParser   *parser = [ [ ITunesXMLParser alloc ] initWithContentsOfURL:aURL];
    
    BOOL        result = NO;
    if ( parser ) {
        //
        [ parser setShouldProcessNamespaces:YES ];
        [ parser setShouldReportNamespacePrefixes:YES ];
        [ parser setShouldResolveExternalEntities:YES ];
        ([parser  shouldProcessNamespaces]) ? NSLog(@"shouldProcessNamespaces YES") : NSLog(@" NO") ;
        ([parser  shouldReportNamespacePrefixes]) ? NSLog(@"shouldReportNamespacePrefixes YES") : NSLog(@" NO") ;
        ([parser  shouldResolveExternalEntities]) ? NSLog(@"shouldResolveExternalEntities YES") : NSLog(@" NO") ;
        
        result = [ parser parse ];
        
        if ( result == NO ) {
            NSError     *theErr = [ parser parserError ];
            if ( [ theErr code ] != 0 ) {
                NSLog(@"%@",[ theErr localizedDescription ] );
            }
        } else {

            NSMutableString *str = [ NSMutableString string ];
      
            NSArray		*items = [ parser newsItems ];
            int		i = 0, cnt = [ items count ];

            
            for ( i = 0; i < cnt; i++ ) {
                
                NSDictionary    *itemDict = [ items objectAtIndex: i ];
                id		    itemElem;

                
                 itemElem = [ itemDict objectForKey: @"elementName" ];
                if ( [ itemElem isEqual:@"title" ] ) {
                    
                    NSString *retString = [[ itemDict objectForKey: @"contents" ] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
                    
                    [ str appendString: retString ];
                    [ str appendString: @"\r" ];
                }

            }
            NSLog(@"----- %@",str);
            
        }

    }
}

作成

参照