iOS 使用ASIHttpRequest和GData解析xml网络文件

首先需要准备好第三方库ASIHttpRequest、GData+xpath和Reachability

接下来我们在使用这些第三方库之前,需要对他们进行配置

对ASIHttpRequest,我们需要连接一下4个库


具体操作:

点击你的项目名


选择targets的选项卡


选择build phases选项卡


分别添加上述4个库,完成对ASIHttpRequest的配置

接下来,我们需要对GData+xpath进行配置

操作

首先点击你的项目名后选择targets选项卡

选择build settings选项卡

对其中的header search paths设置为/usr/include/libxml2,双击可进行设置,靠后点双击

对other linker flags设置为-lxml2




完成以上设置后,可编译下项目看是否存在错误

以下是项目文件布局


在appdelegate的实现文件中,我们采用了导航控制器的格局

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
    // Override point for customization after application launch.
    ViewController *viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
    UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController:viewController];
    
    self.window.rootViewController = nav;
    [nav release];
    [viewController release];
    [self.window makeKeyAndVisible];
    return YES;
}

这是ViewController的头文件

#import <UIKit/UIKit.h>
#import "ASIHTTPRequestDelegate.h"

@interface ViewController : UIViewController<ASIHTTPRequestDelegate,UITableViewDelegate,UITableViewDataSource>
{
    ASIHTTPRequest *_request;
    UITableView *_myTableView;
    NSMutableDictionary *_dic;
    NSMutableArray *_dataArr;
}
@end

这是ViewController的实现文件中的viewdidload方法

#define SINANEW @"http://rss.sina.com.cn/roll/sports/hot_roll.xml"

- (void)viewDidLoad
{
    [super viewDidLoad];
	// Do any additional setup after loading the view, typically from a nib.
    _dic = [[NSMutableDictionary alloc]initWithCapacity:0];
    _dataArr = [[NSMutableArray alloc]initWithCapacity:0];
    
    NSURL *url = [NSURL URLWithString:SINANEW];
    _request = [[ASIHTTPRequest alloc]initWithURL:url];
    _request.delegate = self;
    [_request startAsynchronous];
    
    _myTableView = [[UITableView alloc]initWithFrame:CGRectMake(0, 0, 320, 460-44) style:UITableViewStylePlain];
    _myTableView.delegate = self;
    _myTableView.dataSource = self;
    [self.view addSubview:_myTableView];
    
}

    _dic = [[NSMutableDictionary alloc]initWithCapacity:0];
    _dataArr = [[NSMutableArray alloc]initWithCapacity:0];
对数据存储的字典和数组进行初始化

    NSURL *url = [NSURL URLWithString:SINANEW];
    _request = [[ASIHTTPRequest alloc]initWithURL:url];
    _request.delegate = self;
    [_request startAsynchronous];
对给定的字符串,将其转换为NSURL对象,并初始化asirequest请求,并设置自身为其代理,调用方法startAsynchronous开始异步下载

    _myTableView = [[UITableView alloc]initWithFrame:CGRectMake(0, 0, 320, 460-44) style:UITableViewStylePlain];
    _myTableView.delegate = self;
    _myTableView.dataSource = self;
    [self.view addSubview:_myTableView];
这个位置对tableview进行初始化并设置其代理和数据源


接下来我们要实现asihttprequestdelegate的协议方法

#pragma mark - ASIHTTPRequestDelegate
-(void)requestFinished:(ASIHTTPRequest *)request
{
    NSData *data = [request responseData];
    
    GDataXMLDocument *document = [[GDataXMLDocument alloc]initWithData:data options:0 error:nil];
    if (!document) {
        return;
    }
    
    NSString *xmlPath = @"/rss/channel/item";
    NSArray *nodes = [document nodesForXPath:xmlPath error:nil];
    
    for (GDataXMLElement *element in nodes) {
        NSString *title = [[[element elementsForName:@"title"] lastObject]stringValue];
        NSString *detail = [[[element elementsForName:@"description"] lastObject]stringValue];
        [_dic setValue:detail forKey:title];
        [_dataArr addObject:title];
    }
    
    [_myTableView reloadData];
}

-(void)requestFailed:(ASIHTTPRequest *)request
{
    
}

-(void)requestFinished:(ASIHTTPRequest *)request
这个方法是当下载完成时被调用

    NSData *data = [request responseData];
通过调用responseData方法,获取下载在数据缓冲区中的数据

    GDataXMLDocument *document = [[GDataXMLDocument alloc]initWithData:data options:0 error:nil];
这里使用上面获取的数据实例化GDataXMLDocument类

   NSString *xmlPath = @"/rss/channel/item";
这里我们构造了我们需要数据的xml路径

NSArray *nodes = [document nodesForXPath:xmlPath error:nil];
获取满足该条件的各个节点

for (GDataXMLElement *element in nodes) {
        NSString *title = [[[element elementsForName:@"title"] lastObject]stringValue];
        NSString *detail = [[[element elementsForName:@"description"] lastObject]stringValue];
        [_dic setValue:detail forKey:title];
        [_dataArr addObject:title];
    }
遍历节点,获取其中所要的数据并将数据存在字典与数组中

    [_myTableView reloadData];
这里将数据刷给表格视图来显示


#pragma mark - TableViewDelegate
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [_dataArr count];
}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifies = @"CellIdentifies";
    UITableViewCell *oneCell = [tableView dequeueReusableCellWithIdentifier:CellIdentifies];
    if (!oneCell) {
        oneCell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifies];
    }
    
    oneCell.textLabel.text = [_dataArr objectAtIndex:indexPath.row];
    return oneCell;
}

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *key = [_dataArr objectAtIndex:indexPath.row];
    NSString *detail = [_dic objectForKey:key];
    
    if (detail.length == 4) {
        detail = @"暂无信息";
    }
    DetialViewController *detailCtl = [[DetialViewController alloc]init];
    detailCtl.detail = detail;
    [self.navigationController pushViewController:detailCtl animated:YES];
    [detailCtl release];
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
这个方法决定表格视图显示的行数

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
这个方法决定表格视图中每一个单元格的绘制

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
这个方法当表格视图中的行被点击时被调用

    [self.navigationController pushViewController:detailCtl animated:YES];
这里我们使用了navigationcontroller来push出下一个要显示的视图控制器


以下是detailviewcontroller的头文件

#import <UIKit/UIKit.h>

@interface DetialViewController : UIViewController
{
    NSString *_detail;
    UILabel *_label;
}
@property (nonatomic,copy) NSString *detail;


@end


-(void)setDetail:(NSString *)detail
{
    if (_detail!=detail) {
        [_detail release];
        _detail = [detail retain];
        _label.text = _detail;
    }
}

对属性detail的set方法重写

使得对detail设置值时能同时将其值显示到label上

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
        _label = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, 320, 460-44)];
        _label.numberOfLines = 0;
        _label.backgroundColor = [UIColor whiteColor];
        _label.text = self.detail;
        _label.textColor = [UIColor redColor];
        [self.view addSubview:_label];
    }
    return self;
}

在上述方法中,实例化一个label,用于显示详细内容


















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值