您的位置:首页 > 移动开发 > Objective-C

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

2014-01-14 19:13 357 查看
给大家分享一个 解析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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息