iOS开发之NSXMLParserDelegate解析失败
来源:互联网 发布:外汇手机看盘软件 编辑:程序博客网 时间:2024/04/30 15:17
在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 。欢迎大家访问!
3 0
- iOS开发之NSXMLParserDelegate解析失败
- xml解析代理NSXMLParserDelegate的使用步骤
- iOS开发之html解析
- iOS开发之html解析
- iOS开发之XML解析
- iOS开发之html解析
- iOS开发之XML解析
- iOS开发之XML解析
- iOS开发之json解析
- iOS开发之block解析
- iOS开发之旅之UIViewController解析
- iOS开发之html解析(转)
- iOS开发之UITableView全面解析
- iOS开发之UITableView全面解析
- iOS开发之UITableView全面解析
- iOS开发之UITableView全面解析
- iOS开发之UITableView全面解析
- iOS开发之UITableView全面解析
- windbg符号表路劲设置成功后没有自动下载
- spin_lock_irqsave关中断后,为什么要再禁止抢占呢,不多余吗?
- android 为什么不建议使用Thread.stop()
- HTML控件 隐藏
- 每天工作4小时的程序员
- iOS开发之NSXMLParserDelegate解析失败
- Linux netstat命令详解
- ndk相关
- PopupWindow设置半透明颜色的问题
- Android Fragment完全解析,关于碎片你所需知道的一切
- Linux 内存机制
- CSS 总结01天
- 工厂模式
- 循环~