您的位置:首页 > 移动开发 > IOS开发

iOS开发之NSXMLParserDelegate解析失败

2015-11-30 17:56 525 查看
       在iOS开发中,使用NSXMLParserDelegate来解析XML是非常方便的,代码模式也是比较固定的。这些XML数据一般都是服务器返回的数据。但是我今天碰到一个小插曲,突然发现XML不能解析了。具体情况如下:

服务器返回数据:




然后我的目的是对这个message进行解析。解析代码实现如下:

#import "InternalGateIPXMLParser.h"

@implementation InternalGateIPXMLParser

- (instancetype)initWithXMLString:(NSString*)string {
<p class="p1"><span class="s1">  NSLog</span><span class="s2">(</span><span class="s3">@"initWithXMLString</span><span class="s3">"</span><span class="s2">);</span></p>  NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:true];
InternalGateIPXMLParser *parser = [[InternalGateIPXMLParser alloc] initWithData:data];
parser.delegate = self;
[parser parse];

return self;
}

//第一个代理方法:
- (void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict{
<p class="p1"><span class="s1">  NSLog</span><span class="s2">(</span><span class="s3">@"didStartElement</span><span class="s3">"</span><span class="s2">);</span></p>  self.nodeName = elementName;

}

//第二个代理方法:
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
<p class="p1"><span class="s1">  NSLog</span><span class="s2">(</span><span class="s3">@"foundCharacters</span><span class="s3">"</span><span class="s2">);</span></p>  NSString *str = [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
if (![str  isEqual: @""]) {

if ([self.nodeName isEqualToString:@"message"]) {
NSLog(@"message值:%@",str);
}
}
}

@end


运行程序发现,根本就不会执行这两个代理方法,只能执行到initWithXMLString。问题到底出在哪里呢?

      其实通过仔细观察服务器返回的数据,发现XML前面有一个空行,这也许是NSXMLParserDelegate的一个bug吧,他会把这个认为是非法的XML格式,并且拒绝进行解析,也就不会回调后面的代理方法了。所以修改代码如下,在initWithXMLString方法中加入如下代码:

- (instancetype)initWithXMLString:(NSString*)string {

//需要删除前后的空格与空行;
NSString *str = [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:true];
InternalGateIPXMLParser *parser = [[InternalGateIPXMLParser alloc] initWithData:data];
parser.delegate = self;
[parser parse];

return self;
}


也就是用该方法删除XML前后的空格与空行,然后就可以解析成功了。大家也可以发现,一般在foundCharacters方法中是需要先执行stringByTrimingCharactersInSet方法的。所以建议在传入XML初始化的时候也调用该方法。

最近开源的iOS应用,高仿印象笔记  https://github.com/chenyufeng1991/iOS-Oncenote 。欢迎大家点赞并关注项目进度。也可以安装到手机上试玩哦。

github主页:https://github.com/chenyufeng1991  。欢迎大家访问!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: