気楽なソフト工房

プログラミングについていろいろな記事を書いています。



mykonos2008

Author:mykonos2008
システムエンジニアとして働いている30代の会社員です。
仕事や趣味でプログラムを書いている方の役に立つ記事を書いていきたいと思っています。
ご意見、ご感想はこちらまで
If you are an english speaker,Please visit my english blog.

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
XMLからオブジェクトのデシリアライズをするiOS用のライブラリ「ChimeraXML(キメラXML)」をgithubに公開しました。
iOSのXMLデシリアライズライブラリ「ChimeraXML」

とても長い間を記事を書くのをお休みしていたのですが、また少しずつですが、再開したいと思います。
今後ともぜひよろしくお願いします。

以前はC#の話題を中心に記事を書いていたのですが、今後はブログ名を「気楽なソフト工房」と改名し、 スマートフォンアプリとかWebとかもう少し幅広い分野の記事を扱っていきたいと思います。

再開後、初回の今日は、iPhoneでXMLを扱う際の方法について書いてみたいと思います。
iOSでXMLを扱う場合、iOSが提供している標準のライブラリである「NSXMLParser」や「libxml2」を使用する方法や、または オープンソースで公開されているサードパーティのライブラリを使用する方法があります。 このサイトに色々なライブラリが詳しく紹介されています。

本稿ではiOS標準のSAXのライブラリ「NSXMLParser」を使用する方法をご紹介します。
SAXは一般的にDOMよりメモリ使用量は少ないのですが、低速だと言われています。(英語のサイトですが、ここに 様々なライブラリのパフォーマンス検証の結果が記載されています。)
また、「NSXMLParser」はC言語のライブラリである「libxml2」をObjective-cでラップしているため、それを比較するとさらに低速になります。

ここまでの話を聞いてしまうと「NSXMLParser」で良いのか?と考えてしまうかもしれませんが、私は大抵のケースにおいて問題ないのでは無いかと考えています。
例えば、検索結果1000件のXMLを扱う場合、パフォーマンスに不安無いのかと聞かれるとそれは不安になってしまいます。
ただ、この場合では、例えば50件ずつ表示する仕様にするなどして、別の方法で問題を回避できますし、実際はそういうケースが多いのではと思います。
つまり常識的な範囲で使用している限りはそんなに問題は無いと思っています。

さて、ここからNSXMLParserの使用方法を簡単にご紹介していきます。NSXMLParserを使用するためには以下の2つの事を行う必要があります。
①「NSXMLParserDelegate」プロトコルを採用したクラスを作成する。
②①で作成したクラスをNSXMLParserのdelegateに設定し、パースを実行する。

SAXはイベント駆動で、XMLを上から下に走査しながら、要素の開始タグなどを発見したタイミングで
そのイベントを処理するクラスの所定のメソッドを呼び出すような形になっています。

NSXMLParserの場合、そのイベントを処理クラスが「NSXMLParserDelegate」プロトコルを採用したクラスということになります。

[ParserDelegateImpl.h]
#import <Foundation/Foundation.h>

@interface ParserDelegateImpl : NSObject<NSXMLParserDelegate>

@end

[ParserDelegateImpl.m]
@implementation ParserDelegateImpl

//開始タグ
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI 
      qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
    NSLog(@"didStartElment = %@",elementName); 
}

//終了タグ
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI 
      qualifiedName:(NSString *)qName
{
    NSLog(@"didEndElment = %@",elementName);
}

//テキストノード
-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
    NSLog(@"foundCharacters = %@",string);
}

上記のサンプルコードでは、よく使うメソッドのみを実装していますが、他にも多数メソッドが定義されています。
全てoptionalで定義されているので、必要なものだけ、実装しておけば問題ありません。
次にパースを実行する部分のソースを紹介します。

    NSString *xml = @"<User><Name>太郎</Name></User>"
	
    //NSStringをNSDataに変換する
    NSData *xmlData = [xml dataUsingEncoding:NSUTF8StringEncoding];
	
    //パーサーのインスタンスを生成し、デリゲートを設定する
    ParserDelegateImpl *delegateImpl = [[ParserDelegateImpl alloc] init];
    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:xmlData];
    parser.delegate = delegateImpl;
	
    //パースを実行する
    [parser parse];

NSXMLParserはNSStringを扱うイニシャライザを持っていないので、NSDataに変換してから解析を行う必要があります。
駆け足で簡単にNSXMLParserの使いかたを紹介しましたが、次回はもう少し解析する部分の処理を詳しくご紹介したいと思います。

NSXMLParserでXMLを解析する(2)

コメント

コメントの投稿

管理者にだけ表示を許可する

トラックバック

http://csfun.blog49.fc2.com/tb.php/112-10569423

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。