NSXMLParser rss发出NSXMLParserInvalidCharacterError

时间:2009-07-30 16:50:04

标签: iphone rss nsxmlparser

NSXMLParserInvalidCharacterError#9

这是我在遇到一个奇怪的角色时遇到的错误(比如复制并从文字粘贴到网络表单的引号,最终在Feed中)。我正在使用的Feed没有给出编码,他们没有希望让他们改变它。这就是我在标题中得到的全部内容:

< ?xml version =“1.0”?> < rss version =“2.0”>

解析Feed时,如何处理非法字符?我在解析之前扫描数据吗?我在API中缺少什么?有人处理过这个问题吗?

3 个答案:

答案 0 :(得分:7)

NSString *dataString = [[[NSString alloc] initWithData:webData encoding:NSASCIIStringEncoding] autorelease];

NSData *data = [dataString dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];

修正了我的问题...

答案 1 :(得分:1)

如果NSString -initWithData:encoding:方法失败,则会返回nil,因此您可以尝试一种接一种的编码,直到找到转换后的编码。这并不保证您可以正确转换所有字符,但如果您的Feed源没有正确地发送编码的XML,那么您可能不得不忍受它。

基本理念是:

// try the most likely encoding
NSString xmlString = [[NSString alloc] initWithData:xmlData 
                                           encoding:NSUTF8StringEncoding];

if (xmlString == nil) {
  // try the next likely encoding
  xmlString = [[NSString alloc] initWithData:xmlData 
                                     encoding:NSWindowsCP1252StringEncoding];
}

if (xmlString == nil) {
  // etc...
}

为了通用和健壮,您可以在成功之前执行以下操作:

1。)尝试在HTTP响应的Content-Type标头中指定的编码(如果有的话)

2.。)检查byte order mark的响应数据的开始,如果找到,请尝试指示的编码

3.)查看前两个字节;如果你找到一个空白字符或'<'与nul / zero字符配对,尝试UTF-16(类似地,你可以检查前四个字节,看看你是否有UTF-32)

4.。)扫描数据的开头,查找<?xml ... ?>处理指令,并在其中查找encoding='something';尝试编码。

5.尝试一些常见的编码。如果您的数据源是英文,请务必检查Windows Latin-1,Mac Roman和ISO Latin-1。

6。)如果以上都不起作用,您可以尝试删除大于127的所有字节(或替换'?'或其他ASCII字符)并使用ASCII编码转换数据。

如果此时没有NSString,则应该失败。如果你有一个NSString,你应该在encoding处理指令中查找<?xml ... ?>声明(如果你还没有在步骤4中)。如果它在那里,你应该使用该编码将NSString转换回NSData;如果它不在那里,你应该使用UTF-8编码转换回来。

此外,CFStringConvertIANACharSetNameToEncoding()CFStringConvertEncodingToNSStringEncoding()函数可以帮助获取NSStringEncoding,该编码名称来自Content-Type标头或<?xml ... ?>处理指令。

答案 2 :(得分:0)

您也可以从xml中删除该编码行,如下所示:

int length = str.length >100 ? 100:str.length;
NSString*mystr= [str stringByReplacingOccurrencesOfString:@"encoding=\".*?\"" 
                        withString:@""
                        options:NSRegularExpressionSearch 
                        range:NSMakeRange(0, length)];