解析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.youkuaiyun.com/detail/gwh111/4996808
参考:http://blog.youkuaiyun.com/kay_sprint/article/details/7416989