ページ

2010年3月31日水曜日

TBXML を試す

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

(前回)Cocoaの日々: CocoaでXML

TBXML を使うサンプルを作ってみた。

ソースは GitHub からどうぞ。
TBXMLSample at 2010-03-31 from xcatsan's SampleCode - GitHub

以下、サンプルを作る手順。

まず TBXML をダウンロードする。
TBXML V1.3 - The very fast, light-weight XML parser for Apple iPad, iPhone & iPod Touch


今回は TBXML-v1.3.zip をダウンロードした。解凍すると4つのファイルが現れる。

Xcodeでプロジェクト(TBXMLSample)を作った後、この4ファイルをコピーする。
最後に Frameworks へ libz.dylib を追加すればこれで準備 OK。

試しに Twitpic の APIページに掲載されていたレスポンスのサンプルを sample.xml と error.xml としてリソースへ置いておいた。
sample.xml


error.xml

サンプルアプリは2つボタンを持っていて、それぞれボタンを押すと sample.xml と error.xml をパースして結果をコンソールへ出力する。
コードはこんな感じ。まずボタンのハンドラ。

- (IBAction)parse1:(id)sender
{
[self parseWithXMLFile:@"sample.xml"];
}

- (IBAction)parse2:(id)sender
{
[self parseWithXMLFile:@"error.xml"];
}


続いて実際のパース処理。

- (void)parseWithXMLFile:(NSString*)filename
{
TBXML* tbxml = [TBXML tbxmlWithXMLFile:filename];

TBXMLElement *element = tbxml.rootXMLElement;
NSMutableDictionary* elements = [NSMutableDictionary dictionary];

if (element) {
NSString* status = [TBXML valueOfAttributeNamed:@"status"
forElement:element];

if (status) {
if ([status isEqualToString:@"ok"]) {
element = element->firstChild;

do {
NSString* key = [TBXML elementName:element];
NSString* object = [TBXML textForElement:element];
[elements setObject:object forKey:key];

} while (element = element->nextSibling);

NSLog(@"ok: %@", elements);

} else {
// fail
element = element->firstChild;
if (element) {
NSString* errorCode = [TBXML valueOfAttributeNamed:@"code"
forElement:element];
NSString* errorMsg = [TBXML valueOfAttributeNamed:@"msg"
forElement:element];
NSLog(@"fail: code=%@, msg=%@", errorCode, errorMsg);
}
}
} else {
// error
}
}
}


基本的に TBXML のクラスメソッドを使う。データはクラスではなく構造体として定義されているので、純粋なCプログラミングに近い。


実行してみよう。まず sample.xml のパース。

TBXMLSample[1416:80f] ok: {
    mediaid = abc123;
    mediaurl = "http://twitpic.com/abc123";
    statusid = 1111;
    userid = 11111;
}

出た。

続いて error.xml のパース。

TBXMLSample[1476:80f] fail: code=1001, msg=Invalid twitter username or password

出た。

- - - -
クラスメソッドと構造体を使うのが特徴的。インスタンスを作らないのはフットプリントを減らす為だと思われる。Objective-C というよりは Cプログラミングに近いが、慣れれば比較的簡単にコードが書ける。