おお、恐っ。委員長はお固いねえ~。
ああ、また小芝居が始まった...
絶望した!前回、import、includeの後が何も表示されてなかった事に絶望した!!
ほんとは
って書きたかったんすよ。
ってなってやんの。
忘れてたんだよね<を<、>を>って書く事。で、ごらんのありさまだよ。
いろいろルールがあんだよHTML。
前回パースできなかった理由も似たような理由でして...
<input>タグが閉じてなかったせいでした。
ただしこっちはHTML的には閉じてるんだけどね~。
XML的に駄目だったみたい。<input>と来たら</input>で閉じないとイカンみたいなんですわ。
もしくは<input・・・/>と書けよ、みたいな。
ここらへんは、いろいろネットをあさって勉強中。
奥村晴彦教授のサイト↓がスッキリとしてわかりやすかったっす。
奥村晴彦教授のサイト:XHTMLとCSS
あと、
も駄目みたいです。
とします。
最後に
も駄目、ロボコン0点。
としました。この「"」ダブルクォーテーションか、そのうしろの'green'のような「'」シングルクォーテーションで囲む必要があるみたい。どっちでもいいみたいだけど、まあダブルクォーテーションに統一しときます。
ここらへんを修正したら、ただしくパースしてくれるようになりますた。
こんな感じでずらずらと出力されます。
ここまでできれば、あとは、startElementHandlerで"div"や、"b"、"font"、"blockquote"が来るのを見張って、文字列に応じた動作をすれば各情報を分類できるはず。
bbs.phpから返される情報のうち、<div>~<div/>で囲まれた部分が一つの項目と考え、各項目の保存にはNSMutableArrayを使います。
でもって各項目にはそれぞれ
という情報が来るので
って感じでクラスを定義してもいいんですが、めんどくさいのでNSMutableDictonaryを使います。
こいつはキーワードとなる文字列で登録インスタンスにアクセスできるというクラス。
でaKeyにNSString*型のキーワードを指定してanObjectを登録でき
でaKeyにNSString*型のキーワードを指定する事で登録したanObjectインスタンスを参照できます。
キーワードに使う文字列は任意なので、今回は"name"、"date"、"comment"の3つの文字列を使う事にしました。
NSMutableArrayの方はNSObjectを継承するクラスならなんでも受け入れてくれる可変配列で、
で最後尾にobjectを追加
で追加した順番(0から始まる)指定でのobjectの参照ができます。
こんな構成
で、各関数で
startElementLocalName
"div"が来たら各項目の保存用NSMutableArrayインスタンスに新しいNSMutableDictonaryインスタンスを追加、"b"、"font"、"blockquote"のいずれかが来たら保存用文字列インスタンスをリセット。
charactersFound
startElementLocalNameで用意した保存用文字列インスタンスに保存。
endElementLocalName
startElementLocalNameで用意した保存用文字列インスタンスを各キーワード付きでNSMutableDictonaryインスタンスに登録。
とやってます。
ちなみに今回、startElementHandler、endElementHandler、charactersFoundHandlerでは直接何もせずrssAppDelegateの対応するメソッドに渡すようにしています。
そのためにxmlCreatePushParserCtxtの引数のvoid *user_dataにselfを指定。
これでstartElementHandler、endElementHandler、charactersFoundHandlerの引数、void* ctxには
selfが入ることになるのでrssAppDelegate*にキャストして、自分のメソッドをあらためて呼び出してます。
で、最終的にただしく分類できたかどうかは、connectionDidFinishLoadingで登録した全項目を表示する事で確認。
うりゃっと、実行。
う~ん、日付の後ろに改行が入ってますね。これはPHP側でのファイルIOで引っ付いたんでしょう。
ま、とりあえず、HTTPサーバからのXHTML文をパースできたわけだ。
次回はUITextViewとUIButtonで送信部を実装し、結果をUITableViewで表示してみる。
------------
サンプルプロジェクト:rss6.zip
ああ、また小芝居が始まった...
絶望した!前回、import、includeの後が何も表示されてなかった事に絶望した!!
ほんとは
#import <Foundation/Foundation.h>
#include <stdio.h>
って書きたかったんすよ。
#import
#include
ってなってやんの。
忘れてたんだよね<を<、>を>って書く事。で、ごらんのありさまだよ。
いろいろルールがあんだよHTML。
前回パースできなかった理由も似たような理由でして...
<input>タグが閉じてなかったせいでした。
ただしこっちはHTML的には閉じてるんだけどね~。
XML的に駄目だったみたい。<input>と来たら</input>で閉じないとイカンみたいなんですわ。
もしくは<input・・・/>と書けよ、みたいな。
・
・
<form action="" method="POST" name="line">
名前:<input type="TEXT" name="name" value = "">
<textarea name="comment" rows="4" cols="60"></textarea>
<input type="SUBMIT" value="書き込み/更新">
</form>
・
・
ここらへんは、いろいろネットをあさって勉強中。
奥村晴彦教授のサイト↓がスッキリとしてわかりやすかったっす。
奥村晴彦教授のサイト:XHTMLとCSS
あと、
<hr>
も駄目みたいです。
<hr/>
とします。
最後に
<font size=2 color='green'
も駄目、ロボコン0点。
<font size="2" color="green"
としました。この「"」ダブルクォーテーションか、そのうしろの'green'のような「'」シングルクォーテーションで囲む必要があるみたい。どっちでもいいみたいだけど、まあダブルクォーテーションに統一しときます。
ここらへんを修正したら、ただしくパースしてくれるようになりますた。
localname html
localname meta
localname html
localname head
localname title
localname body
localname form
localname input
localname textarea
localname input
localname div ←1つめの項目の開始
localname b
localname font
localname blockquote
localname hr
localname div ←2つめの項目の開始
localname b
localname font
localname blockquote
localname br
localname hr
こんな感じでずらずらと出力されます。
ここまでできれば、あとは、startElementHandlerで"div"や、"b"、"font"、"blockquote"が来るのを見張って、文字列に応じた動作をすれば各情報を分類できるはず。
bbs.phpから返される情報のうち、<div>~<div/>で囲まれた部分が一つの項目と考え、各項目の保存にはNSMutableArrayを使います。
でもって各項目にはそれぞれ
<b>名前<b/>
<font>日付<font/>
<blockquote>コメント<blockquote/>
という情報が来るので
@interface BBSItem : NSObject {
NSString* name; // 名前
NSString* date; // 日付
NSString* comment; // コメント
}
@end
って感じでクラスを定義してもいいんですが、めんどくさいのでNSMutableDictonaryを使います。
こいつはキーワードとなる文字列で登録インスタンスにアクセスできるというクラス。
- (void)setObject:(id)anObject forKey:(id)aKey
でaKeyにNSString*型のキーワードを指定してanObjectを登録でき
- (id)objectForKey:(id)aKey
でaKeyにNSString*型のキーワードを指定する事で登録したanObjectインスタンスを参照できます。
キーワードに使う文字列は任意なので、今回は"name"、"date"、"comment"の3つの文字列を使う事にしました。
NSMutableArrayの方はNSObjectを継承するクラスならなんでも受け入れてくれる可変配列で、
- (void)addObject:(id)object
で最後尾にobjectを追加
- (id)objectAtIndex:(NSUInteger)index
で追加した順番(0から始まる)指定でのobjectの参照ができます。
こんな構成
で、各関数で
startElementLocalName
"div"が来たら各項目の保存用NSMutableArrayインスタンスに新しいNSMutableDictonaryインスタンスを追加、"b"、"font"、"blockquote"のいずれかが来たら保存用文字列インスタンスをリセット。
charactersFound
startElementLocalNameで用意した保存用文字列インスタンスに保存。
endElementLocalName
startElementLocalNameで用意した保存用文字列インスタンスを各キーワード付きでNSMutableDictonaryインスタンスに登録。
とやってます。
ちなみに今回、startElementHandler、endElementHandler、charactersFoundHandlerでは直接何もせずrssAppDelegateの対応するメソッドに渡すようにしています。
そのためにxmlCreatePushParserCtxtの引数のvoid *user_dataにselfを指定。
これでstartElementHandler、endElementHandler、charactersFoundHandlerの引数、void* ctxには
selfが入ることになるのでrssAppDelegate*にキャストして、自分のメソッドをあらためて呼び出してます。
で、最終的にただしく分類できたかどうかは、connectionDidFinishLoadingで登録した全項目を表示する事で確認。
うりゃっと、実行。
---------------------
bbs item counts = 2
---------------------
name = iPhoneから
date = 2009/10/18 00:46:20
comment = もう一回
name = iPhoneから
date = 2009/10/17 23:12:44
comment = うちこんでみた。
う~ん、日付の後ろに改行が入ってますね。これはPHP側でのファイルIOで引っ付いたんでしょう。
ま、とりあえず、HTTPサーバからのXHTML文をパースできたわけだ。
次回はUITextViewとUIButtonで送信部を実装し、結果をUITableViewで表示してみる。
------------
サンプルプロジェクト:rss6.zip