的NSXMLParser错误遇到“特殊”字符

问题描述:

我想使用的NSXMLParser解析,看起来像这样的XML文件时:的NSXMLParser错误遇到“特殊”字符

<?xml version="1.0" encoding="us-ascii"?> 
<teams> 
    <team id = "A1"> 
     <player1>John</player1> 
     <player2>José</player2> 
    </team> 
    ... 
</teams> 

我使用下面的代码:

NSString *urlString = [NSString stringWithFormat:@"http://www....abc.php?category=%@&poule=%c", @"S", 'B']; // Obviously, this contains an actual web address 
NSURL *url = [NSURL URLWithString:urlString]; 
NSData *xml = [[NSData alloc] initWithContentsOfURL:url]; // <== 
NSXMLParser *xmlParserObject = [[NSXMLParser alloc]initWithData:xml]; 
[xmlParserObject setDelegate:self]; 
[xmlParserObject parse]; 

和我实现了didStartElement,foundCharacters,didEndElement和parserErrorOccurred委托函数。

这一切都很顺利,直到遇到一个'特殊'字符,例如é。委托方法parserErrorOccurred报告以下错误:

parser error: Error Domain=NSXMLParserErrorDomain Code=1544 "The operation couldn’t be completed. (NSXMLParserErrorDomain error 1544.)" 
parser error: Error Domain=NSXMLParserErrorDomain Code=5 "The operation couldn’t be completed. (NSXMLParserErrorDomain error 5.)" 

然后我取代标有“< ==”用以下的部分:

NSError *error; 
NSData *xml = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error]; 
if (xml == nil) { 
    NSLog(@"*** Fatal error: %@\nuserInfo:%@", error, [error userInfo]); 
} 

并且除了上面的一个得到了下面的错误:

*** Fatal error: Error Domain=NSCocoaErrorDomain Code=261 "The operation couldn’t be completed. (Cocoa error 261.)" UserInfo=0x8158d90 {NSURL=http://www....abc.php?category=S&poule=B, NSStringEncoding=4} 
userInfo:{ 
    NSStringEncoding = 4; 
    NSURL = "http://www....abc.php?category=S&poule=B"; 
} 

我还试图与任何其他编码器,如NSISOLatin1StringEncoding,NSUTF16StringEncoding,NSASCII的更换NSUTF8StringEncoding StringEncoding,NSUnicodeStringEncoding等等。这导致了以下错误:

-[__NSCFString bytes]: unrecognized selector sent to instance 0x6e4cbc0 
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString bytes]: unrecognized selector sent to instance 0x6e4cbc0' 
*** First throw call stack: 
(0x12d0022 0x1781cd6 0x12d1cbd 0x1236ed0 0x1236cb2 0xce5f51 0xb447 0xaa89 0x1f2e330 0x1f2f439 0x908b9b24 0x908bb6fe) 
terminate called throwing an exception(lldb) 

我有过XML的内容没有控制权,但如果它确实包含了不正确的信息,那么也许我可以跟站长。

我很好,显示é字符'e'或'?'如果这是需要的。

任何有关此错误的原因以及如何纠正或绕过它的建议非常感谢。

Tx!

--GB

我发现一个旁路(而不是解决方案)这个问题。要从NSURL到NSData的获得,我用下面的代码:

 NSError *error; 
     NSString *xmlText = [NSString stringWithContentsOfURL:url encoding:NSASCIIStringEncoding error:&error]; 
     xmlText = [xmlText stringByReplacingOccurrencesOfString:@"é" withString:@"e"]; 
     NSData *xml = [xmlText dataUsingEncoding:NSASCIIStringEncoding]; 

所以基本上,我

  • 转换的NSURL在一个NSString
  • 通过更换“特殊编辑的字符串'字符
  • 使用的编辑字符串创建NSData的

我还发现,我不得不使用NSAS CIIStringEncoding而不是NSUTF8StringEncoding(这是XML指定的内容,但之前失败)。

无论如何,建议真正解决这个问题仍然是值得欢迎的,但是这个旁路对我来说暂时是有效的......