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
原创粉丝点击