iOS开发之NSXMLParserDelegate解析失败
2015-11-30 17:56
525 查看
在iOS开发中,使用NSXMLParserDelegate来解析XML是非常方便的,代码模式也是比较固定的。这些XML数据一般都是服务器返回的数据。但是我今天碰到一个小插曲,突然发现XML不能解析了。具体情况如下:
服务器返回数据:
。
然后我的目的是对这个message进行解析。解析代码实现如下:
运行程序发现,根本就不会执行这两个代理方法,只能执行到initWithXMLString。问题到底出在哪里呢?
其实通过仔细观察服务器返回的数据,发现XML前面有一个空行,这也许是NSXMLParserDelegate的一个bug吧,他会把这个认为是非法的XML格式,并且拒绝进行解析,也就不会回调后面的代理方法了。所以修改代码如下,在initWithXMLString方法中加入如下代码:
也就是用该方法删除XML前后的空格与空行,然后就可以解析成功了。大家也可以发现,一般在foundCharacters方法中是需要先执行stringByTrimingCharactersInSet方法的。所以建议在传入XML初始化的时候也调用该方法。
最近开源的iOS应用,高仿印象笔记 https://github.com/chenyufeng1991/iOS-Oncenote 。欢迎大家点赞并关注项目进度。也可以安装到手机上试玩哦。
github主页:https://github.com/chenyufeng1991 。欢迎大家访问!
服务器返回数据:
。
然后我的目的是对这个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 。欢迎大家访问!
相关文章推荐
- iOS: 如何判断代码运行在DEBUG还是RELEASE模式下?
- iOS h264 硬解码
- iOS:XMPP即时聊天知识
- iOS实现Cell自适应高度
- iOS应用间调用
- 如何设计一个 iOS 控件?(iOS 控件完全解析)
- 画虚线
- IOS SDK详解之NSDictionary
- iOS开发入门到精通四阶段
- 关于苹果开发者账号的大部分事
- 【iOS9】真机测试添加证书
- ios has ambiguous scrollable content height
- iOS开发-进阶:延时执行的几种方式的比较和汇总
- iOS多线程GCD
- iOS 开发,工程中混合使用 ARC 和非ARC
- iOS开发:获取系统邮箱地址
- AutoLayout中的Content Hugging 和 Content Compression Resistance
- iOS 打包ipa
- iOS学习之点击TableViewcell实现跳转
- iOS从相机或相册获取图片并裁剪,再获取裁剪后的图片