こんにちは、開発担当の常です。
通常、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 において、発生頻度が高いようです。
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"]; NSRange xmlHeaderEnd = [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];