给大家分享一个 解析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