iOS Objective-C 解析XML SAX解析方法

给大家分享一个  解析XML  中的 SAX解析



这是我要解析的XML文件     由于城市过多   我就在中间删掉一部分  方便查看

<xml_api_reply version="1">
	<cities>
		<city default="true">
			<name data="北京"></name>
			<latitude_e6 data="39930000"></latitude_e6>
			<longitude_e6 data="116279998"></longitude_e6>
		</city>
		<city>
			<name data="沈阳"></name>
			<latitude_e6 data="41770000"></latitude_e6>
			<longitude_e6 data="123430000"></longitude_e6>
		</city>
	
		<city>
			<name data="大连"></name>
			<latitude_e6 data="38900001"></latitude_e6>
			<longitude_e6 data="121629997"></longitude_e6>
		</city>
		<city>
			<name data="周口"></name>
			<latitude_e6 data="33000000"></latitude_e6>
			<longitude_e6 data="114019996"></longitude_e6>
		</city>
		<city>
			<name data="驻马店"></name>
			<latitude_e6 data="33000000"></latitude_e6>
			<longitude_e6 data="114019996"></longitude_e6>
		</city>
	</cities>
</xml_api_reply>


创建一个SaxParser类 

.h中代码

#import <Foundation/Foundation.h>

@protocol backModel;//我这个协议是回调用的  这里可以忽略这个协议及其方法

@class CityModel;

@interface SaxParser : NSObject<NSXMLParserDelegate>

{
    CityModel      *  _model;      //创建一个CityModel类  里面有一个初始化方法即可      
    NSMutableArray *  _cityArray;  //用来存放 model的数组 
    NSString       *  _currName;   //name变量
    NSString       *  _currLat;    //lat变量
    NSString       *  _currLon;    //lon变量
}
-(void)starParser;

@property(nonatomic,assign) id<backModel> delegate;

@end



@protocol backModel <NSObject>
//协议方法  回传
-(void)backModelArray:(NSMutableArray *)array;

@end


.m中代码

#import "SaxParser.h"
#import "CityModel.h"


@implementation SaxParser

-(void)dealloc{
    [_cityArray release];
    [super dealloc];
}

-(id)init{
    if ([super init]) {
     
        _cityArray = [[NSMutableArray alloc] init]; //初始化数组
        
    }
    return self;
}

//这个方法在RootViewController中用SaxParser的对象去调用
-(void)starParser{
    //从bundel包中获取xml文件
    NSString * path = [[NSBundle mainBundle] pathForResource:@"citys" ofType:@"xml"];
    NSData * data = [NSData dataWithContentsOfFile:path];
    
    NSXMLParser * xml = [[NSXMLParser alloc] initWithData:data];
    
    xml.delegate = self; //设置代理人
    
    [xml parse]; //开始解析
    [xml release];
 
}

//创建标签  判断用

static NSString * kCity = @"city";
static NSString * kName = @"name";
static NSString * kLat = @"latitude_e6";
static NSString * kLon = @"longitude_e6";
static NSString * kCities = @"cities";




//开始解析  走节点前面的
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
    
//    NSLog(@"%@",attributeDict);
    if ([elementName isEqualToString:kCity]) {
        _model = [[[CityModel alloc] init] autorelease];//初始化model
        [_cityArray addObject:_model];                  //将每个model都存到数组中
    }
    if ([elementName isEqualToString:kName]) {
        _currName = [attributeDict objectForKey:@"data"];
//        NSLog(@"name  =====  %@",_currName);
    }
    if ([elementName isEqualToString:kLat]) {
        _currLat = [attributeDict objectForKey:@"data"];
//         NSLog(@"lat  =====  %@",_currLat);
    }
    if ([elementName isEqualToString:kLon]) {
        _currLon = [attributeDict objectForKey:@"data"];
//         NSLog(@"lon  =====  %@",_currLon);
    } 
}


//结束解析  走节点后面的
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
    
//    NSLog(@"%@",elementName);
    
    
    if ([elementName isEqualToString:kName]) {
        _model.name = _currName;
    }
    if ([elementName isEqualToString:kLat]) {
        _model.latitude = _currLat;
    }
    if ([elementName isEqualToString:kLon]) {
        _model.longitude = _currLon;
    }
    if ([elementName isEqualToString:kCities]) {
        
        if ([self.delegate respondsToSelector:@selector(backModelArray:)]) {
            [self.delegate backModelArray:_cityArray];   //将这个数组回传到RootViewController
        }
//        NSLog(@"数组  ===  %@",_cityArray);
//        NSLog(@"%d",_cityArray.count);
        
    }

}
@end





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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值