2010年11月13日土曜日

NSXMLElementの下にあるテキスト部を抜き出す

動機
これで取り出したものに対してこれをやってみたいなぁっていうあたりからタグを外さないとと思い立って始めた(コード1).(タイトルはここまで.これを記録するためのエントリー)
ところが,MeCabにHTMLタグ付きで入れてもそれらを対象とせずに問題なく処理するらしいことを後で知った.のでこれだけなら単純にNXSMLNodeのstringValueメソッドでもよかた.
ただ,この方法ではエンコードされた文字('>'→'>')などはそのままになってしまう.そこでNSAttributedStringを利用してこれを解決してみた(コード2).参考


やってみた
コード1(戦略: HTMLのパース結果であるNSXMLNodeの種類を利用してNSXMLTextKindを収集することでタグのない部分を集める)
- (NSString *)textStringWithNode:(NSXMLNode *)elem
{
NSMutableString *ret= [NSMutableString string];
int j, jc= [elem childCount];
for(j= 0; j<jc; j++) {
NSXMLNode *elmeChild= [elem childAtIndex:j];
if ([elmeChild kind] == NSXMLTextKind) {
[ret appendString:[elmeChild stringValue]];
}
else {
[ret appendString:[self textStringWithNode:elmeChild]];
}
}
return ret;
}

コード2(戦略: HTMLソース文字列からNSAttributedStringを生成し,stringメソッドでNSString化することでタグ類を外す.タグ類は属性となっているのでstringには出てこない)
- (NSString *)textStringWithHTMLNode:(NSXMLNode *)elem
{
NSString *input= [elem stringValue];

NSDictionary *option= [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithInt:NSUTF8StringEncoding],
NSCharacterEncodingDocumentOption,
nil];
NSAttributedString *as= [[NSAttributedString alloc] initWithHTML:
[input dataUsingEncoding:NSUTF8StringEncoding]
options:option
documentAttributes:nil];
[as autorelease];
return[as string];
}

このメソッドの引数は都合でNXSMLNodeにしているが,一行目の処理どおり,HTMLソースを文字列(NSString)として持っている場合でも,利用することができそうだ.

0 件のコメント: