NSXMLParserで指定したタグの取得ってどうするの?
NSXMLParserって、SAXパーザだからXPathとかDomとか使えないもんだから、HTMLとかXMLを読み込ませたときにあのElementの値を取りだしたいのになぁと思う時があってさ。
で、どうすんのかなぁって。
呼び出されるコールバック関数内で、XPATHっぽいのを作成して、んでそれでなんとかできるかなぁと思て作ってみてる。
NSMutableString *path = [NSMutableString stringWithString:elementName]; NSString *t; if(t = [attributeDict objectForKey:@"id"]){ [path appendString:[NSString stringWithFormat:@"[@id='%@']",t]]; }else if(t = [attributeDict objectForKey:@"class"]){ [path appendString:[NSString stringWithFormat:@"[@class='%@']",t]]; }else if([elementCount intValue] > 1){ [path appendString:[NSString stringWithFormat:@"[position()==%d]",[elementCount intValue]]]; } [pathArray addObject:path];
開始タグを検出したら実行されるコールバックで↑の処理を行って
XPATHっぽいのは↓で生成する。
[NSString pathWithConponents:pathArray];
終了タグを検出したら↓の処理を行う
[pathArray removeLastObject];
あとは、このオブジェクトにさらにDelegateを設定して、処理を行わせるとか。
というところで、試しに携帯百景のHTMLを読み込んでみたのだけどもparseErrorになっちまった。
ちゃんちゃん。
(つづく)
※ XPath搭載されてないブラウザでXPathを使えるようにする実装を作ったamachangってやっぱすげいな。
※ execTargetというNSDictionaryを渡しておいて↓のような処理を行うのはどうか。
if([execTarget objectForKey:[NSString pathWithConponents:pathArray]] != nil){ [self.delegate performSelector:@selector(tagProcess:) withObject:element]; }