Developer's Blog

【iOS】XMLパースエラーNSXMLParserSpaceRequiredErrorの対策

こんにちは、開発担当の常です。

通常、XMLデータを解析する場合、NSXMLParserを使って、NSData *dataを

 
NSXMLParser* parser = [[NSXMLParser alloc] initWithData:data];
    

といった感じで渡してやれば大丈夫です。


でも、XMLデータの文字エンコードがShift_JISである場合、

 
<?xml version="1.0" encoding="Shift_JIS" ?>
<Project>
<project_name>★☆★最優先案件 プロジェクト★☆★</project_name>
</Project>
    

非常に稀なケースですが、NSXMLParserSpaceRequiredErrorというパースエラーが発生します。
特に、iOS 6 において、発生頻度が高いようです。
XMLパーサー

iOSのドキュメントに、下記のような説明があります。
NSXMLParserSpaceRequiredError
Space is required.
XMLデータ自体に半角スペースの不備があるのかも知れないですが、
いろいろ調査してみても、XMLデータ自身は問題がなさそうです。

いろいろ試してみたところ、下記の対策で、問題が解決できました。
対策:Shift-JISのデータをutf-8のデータに変換する

 
NSString *utf8str = [[[NSString alloc] initWithData:xmlData encoding:NSShiftJISStringEncoding] autorelease];
NSRange xmlHeaderStart = [utf8str rangeOfString:@"<?xml"&#93;;
NSRange xmlHeaderEnd = &#91;utf8str rangeOfString:@"?>"];

NSData *newData = NULL;
if (xmlHeaderStart.location != NSNotFound &&
    xmlHeaderEnd.location != NSNotFound &&
    xmlHeaderEnd.location > xmlHeaderStart.location) {
        
    // ヘッダ情報からエンコードShift_JISをutf-8に変換する
    utf8str = [utf8str stringByReplacingOccurrencesOfString:@"\"Shift_JIS\"" withString:@"\"utf-8\"" 
        options:NSCaseInsensitiveSearch range:NSMakeRange(xmlHeaderStart.location, xmlHeaderEnd.location)];
        
    // Shift-JISのデータをutf-8のデータに変換する
    newData = [utf8str dataUsingEncoding:NSUTF8StringEncoding];
}
    

さらにnewDataを渡して、解析すればOKです。

 
NSXMLParser* parser = [[NSXMLParser alloc] initWithData:newData];
 

Copyright © 2019 Fenrir Inc. All rights reserved.