现在的位置: 首页 > 综合 > 正文

xml解析新浪新闻_客户端_下拉刷新

2013年12月07日 ⁄ 综合 ⁄ 共 5904字 ⁄ 字号 评论关闭

关于选择哪种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

【上篇】
【下篇】

抱歉!评论已关闭.