关于选择哪种xml库解析http://www.raywenderlich.com/553/how-to-chose-the-best-xml-parser-for-your-iphone-project
解析xml的库有很多,先学会自带的就可以了。
解析 XML 通常有两种方式,DOM 和 SAX:
DOM解析XML时,读入整个XML文档并构建一个驻留内存的树结构(节点树),通过遍历树结构可以检索任意XML节点,读取它的属性和值。而且通常情况下,可以借助XPath,直接查询XML节点。
SAX解析XML,是基于事件通知的模式,一边读取XML文档一边处理,不必等整个文档加载完之后才采取操作,当在读取解析过程中遇到需要处理的对象,会发出通知对其进行处理。
NSXMLParser,http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSXMLParser_Class/Reference/Reference.html ,这是一个SAX方式解析XML的类库,默认包含在iOS SDK中,使用也比较简单。
看一段xml代码,比如<title>和<title>之间就是要获取的内容,所以要解析到<title>把后面的内容读出来直到下一个<title>为止
<item> <title> <![CDATA[[社会]女司机在故障红灯前等40分钟报警求助(01/14 15:13)]]> </title> <link>http://go.rss.sina.com.cn/redirect.php?url=http://news.sina.com.cn/s/2013-01-14/151326030803.shtml</link> <author>WWW.SINA.COM.CN</author> <guid>http://go.rss.sina.com.cn/redirect.php?url=http://news.sina.com.cn/s/2013-01-14/151326030803.shtml</guid> <category> <![CDATA[]]> </category> <pubDate>Mon, 14 Jan 2013 07:13:46 GMT</pubDate> <comments></comments> <description> <![CDATA[ 1月11日,记者联系到了李女士,她给记者讲述了当时的情况。“我等了40分钟,说到底是担心不遵守交通规则会不安全。”她说。 遇红灯不变 女司机坚持等 11日10时15分,李女士准备开车出门办事,却发现道路上异常拥堵。“平时我都是11点出门,因为有事当天才出门....]]> </description> </item> <item>
ViewController.h文件里申明协议<NSXMLParserDelegate>
@property (nonatomic,strong) NSMutableArray *newsTitle; @property (nonatomic,strong) NSMutableArray *description; @property (nonatomic,strong) NSMutableArray *newsPubdate; @property (nonatomic,strong) NSMutableString *tempString;
解析需要用到新闻名,发布时间,内容。
只需三个方法#pragma NSXMLParserDelegate
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict { if([elementName isEqualToString:@"title"]) { if(self.newsTitle == nil) self.newsTitle = [[NSMutableArray alloc]init]; } else if([elementName isEqualToString:@"description"]) { if(self.description == nil) self.description = [[NSMutableArray alloc]init]; } else if([elementName isEqualToString:@"pubDate"]) { if(self.newsPubdate == nil) self.newsPubdate = [[NSMutableArray alloc]init]; } } -(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { if(self.tempString == nil) self.tempString = [[NSMutableString alloc]init]; [self.tempString appendString:string]; } -(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { if([elementName isEqualToString:@"title"]) { [self.newsTitle addObject:self.tempString]; } else if([elementName isEqualToString:@"description"]) { [self.description addObject:self.tempString]; } else if([elementName isEqualToString:@"pubDate"]) { [self.newsPubdate addObject:self.tempString]; } self.tempString = nil; }
自定义UITableViewCell名称为Cell
新建Cell子类 xcode4.5版本中直接在storyboard中键,class选择Cell,identifier填上cell
加上控键,直接在Cell.h里申明输出口
@property (nonatomic,retain) IBOutlet UITextView *tit; @property (nonatomic,retain) IBOutlet UILabel *date;
在ViewController.m里添方法
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"cell"; Cell *cell = (Cell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; return cell; }
应为解析的xml内容有空格删除空格
NSString *sub_title = [title stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
添加下拉刷新功能,用了个别人做的类
实现的开源框架是:https://github.com/enormego/EGOTableViewPullRefresh
添加RefreshTableHeaderView文件夹和QuartzCore.framework
在ViewController.h里引入#import "EGORefreshTableHeaderView.h"并添加协议EGORefreshTableHeaderDelegate
申明
EGORefreshTableHeaderView *_refreshHeaderView; BOOL _reloading;
方法
- (void)reloadTableViewDataSource; - (void)doneLoadingTableViewData;
在ViewController.m里
- (void)viewDidLoad { [super viewDidLoad]; NSXMLParser *xmlParser = [[NSXMLParser alloc]initWithContentsOfURL:[NSURL URLWithString:@"http://rss.sina.com.cn/news/marquee/ddt.xml"]]; self.tempString = nil; [xmlParser setDelegate:self]; [xmlParser parse]; if (_refreshHeaderView == nil) { EGORefreshTableHeaderView *view = [[EGORefreshTableHeaderView alloc] initWithFrame:CGRectMake(0.0f, 0.0f - self.tableView.bounds.size.height, self.view.frame.size.width, self.tableView.bounds.size.height)]; view.delegate = self; [self.tableView addSubview:view]; _refreshHeaderView = view; [view release]; } // update the last update date [_refreshHeaderView refreshLastUpdatedDate]; }
下面这段复制进去
#pragma mark - #pragma mark Data Source Loading / Reloading Methods - (void)reloadTableViewDataSource{ NSLog(@"reloadTableViewDataSource"); [self.newsTitle removeAllObjects]; [self.newsPubdate removeAllObjects]; [self.description removeAllObjects]; xmlParser = [[NSXMLParser alloc]initWithContentsOfURL:[NSURL URLWithString:@"http://rss.sina.com.cn/news/marquee/ddt.xml"]]; self.tempString = nil; [xmlParser setDelegate:self]; [xmlParser parse]; // should be calling your tableviews data source model to reload // put here just for demo _reloading = YES; } - (void)doneLoadingTableViewData{ [self.tableView reloadData]; // model should call this when its done loading _reloading = NO; [_refreshHeaderView egoRefreshScrollViewDataSourceDidFinishedLoading:self.tableView]; } #pragma mark - #pragma mark UIScrollViewDelegate Methods - (void)scrollViewDidScroll:(UIScrollView *)scrollView{ [_refreshHeaderView egoRefreshScrollViewDidScroll:scrollView]; } - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{ [_refreshHeaderView egoRefreshScrollViewDidEndDragging:scrollView]; } #pragma mark - #pragma mark EGORefreshTableHeaderDelegate Methods - (void)egoRefreshTableHeaderDidTriggerRefresh:(EGORefreshTableHeaderView*)view{ [self reloadTableViewDataSource]; [self performSelector:@selector(doneLoadingTableViewData) withObject:nil afterDelay:1.0]; } - (BOOL)egoRefreshTableHeaderDataSourceIsLoading:(EGORefreshTableHeaderView*)view{ return _reloading; // should return if data source model is reloading } - (NSDate*)egoRefreshTableHeaderDataSourceLastUpdated:(EGORefreshTableHeaderView*)view{ return [NSDate date]; // should return date data source was last changed }
特别记得添加[self.tableView reloadData];
demo下载:http://download.csdn.net/detail/gwh111/4996808
参考:http://blog.csdn.net/kay_sprint/article/details/7416989