[iOS] NSXMLParser で文字列が1つのエレメントで複数に分かれてパースされる

2012/07/20

2012/07/22
追記エントリです
>> [iOS] NSXMLParser。SAXとDOMの比較とか

以下もと記事です。
—-
こんにちは。きんくまです。

NSXMLParserを使って、XMLをパースしていたところ、こんな問題が出ました。

例)こんな文字列があったとして

<ele>abc あいう</ele>

parser: foundCharacters:
というので文字列を取得したときに、本来は1回で
「abc あいう」という文字列が欲しいのだけれど、実際は

1回目
abc

2回目
あいう

と2回に分けて文字列がひっぱられてしまっていた。自分の場合は

英数字+マルチバイト

の場合がこうなってしまうみたい。

マルチバイト+英数字

の順番だと問題なく1回だけで文字列が取得できた。

解決方法

調べてみたけど、特にパース用のフラグとかがなさそうだったので手動でやることにした。
パースのカウントが2回以上だったら、仮に保存しておいたものと連結というふうにした。

もし英数字+日本語をパースするんだったらいつもこういうことやっとかないといけないかも。

インスタンス変数を用意

    int _elementParseCount; //追加
    NSString *_lastParsedString; //追加
    BOOL inEle; //名前は適当です

実装側.mで

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
    _elementParseCount = 0;
    _lastParsedString = nil;
    if([elementName isEqualToString:@"ele"]){
        inEle = YES;
    }
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
    if([elementName isEqualToString:@"ele"]){
        inEle = NO;
        //_lastParsedStringを使って本来やりたいことをする
    }
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
    if(inEle){
        if(_elementParseCount > 0){
            string = [NSString stringWithFormat:@"%@%@", _lastParsedString, string];
        }
        _lastParsedString = string;
        _elementParseCount++;
    }
}
LINEで送る
Pocket

自作iPhoneアプリ 好評発売中!
フォルメモ - シンプルなフォルダつきメモ帳
ジッピー電卓 - 消費税や割引もサクサク計算!

LINEスタンプ作りました!
毎日使える。とぼけたウサギ。LINEスタンプ販売中! 毎日使える。とぼけたウサギ

ページトップへ戻る