现有StudentModel如下:
#import <Foundation/Foundation.h>
@interface StudentModel : NSObject
@property(nonatomic,copy) NSString *name;
@property(nonatomic,copy) NSString *age;
@property(nonatomic,copy) NSString *tel;
- (instancetype)init;
@end
XML如下:
<root>
<stu_list>
<stu_array name="A">
<student>
<name>刘吉吉</name>
<age>18</age>
<tel>120</tel>
</student>
<student>
<name>刘骚辉</name>
<age>19</age>
<tel>110</tel>
</student>
</stu_array>
<stu_array name="B">
<student>
<name>龚公公</name>
<age>20</age>
<tel>119</tel>
</student>
<student>
<name>蓝翔</name>
<age>21</age>
<tel>114</tel>
</student>
</stu_array>
</stu_list>
</root>
创建解析类:
#import <Foundation/Foundation.h>
@protocol SaxXmlParserDelegate <NSObject>
@required
//协议传值
- (void)parserFinished:(NSArray *)array;
@end
@interface SaxXmlParser : NSObject<NSXMLParserDelegate>{
NSMutableArray *_stuArray;
}
@property(nonatomic,assign) id<SaxXmlParserDelegate>delegate;
@property(nonatomic,copy) NSString *currentValue;
- (instancetype)init;
- (void)startParser;
@end
#import "SaxXmlParser.h"
#import "StudentModel.h"
@implementation SaxXmlParser
- (void)dealloc{
[_stuArray release];
_stuArray = nil;
[_currentValue release];
_currentValue = nil;
[super dealloc];
}
- (instancetype)init{
self = [super init];
if(self){
_stuArray = [[NSMutableArray alloc]init];
}
return self;
}
- (void)startParser{
//获取xml文件路径
NSString *path = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"xml"];
//根据路径将文件转换成二进制对象
NSData *data = [NSData dataWithContentsOfFile:path];
//Xml解析器
NSXMLParser *parser = [[NSXMLParser alloc]initWithData:data];
//设置代理人
parser.delegate = self;
//开始解析
[parser parse];
}
static NSString *kRoot = @"root";
static NSString *kStuArray = @"stu_array";
static NSString *kStudent = @"student";
static NSString *kName = @"name";
static NSString *kAge = @"age";
static NSString *kTel = @"tel";
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName/*节点名*/ namespaceURI:(NSString *)namespaceURI/*属性*/ qualifiedName:(NSString *)qName/**/ attributes:(NSDictionary *)attributeDict/**/{
if([elementName isEqualToString:kStuArray]){
NSMutableDictionary *dic = [NSMutableDictionary dictionary];
[dic addEntriesFromDictionary:attributeDict];//把attributeDict所有内容取出添加进dic
NSMutableArray *array = [NSMutableArray array];
[dic setObject:array forKey:@"array"];
[_stuArray addObject:dic];
}
if([elementName isEqualToString:kStudent]){
StudentModel *model = [[StudentModel alloc]init];
//找到存储StudentModel的小数组
NSMutableDictionary *lastDic = [_stuArray lastObject];
NSMutableArray *lastArray = [lastDic objectForKey:@"array"];
[lastArray addObject:model];
}
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
if([elementName isEqualToString:kName]){
NSMutableDictionary *dic = [_stuArray lastObject];
NSMutableArray *array = [dic objectForKey:@"array"];
StudentModel *model = [array lastObject];
model.name = _currentValue;
}
if([elementName isEqualToString:kAge]){
NSMutableDictionary *dic = [_stuArray lastObject];
NSMutableArray *array = [dic objectForKey:@"array"];
StudentModel *model = [array lastObject];
model.age = _currentValue;
}
if([elementName isEqualToString:kTel]){
NSMutableDictionary *dic = [_stuArray lastObject];
NSMutableArray *array = [dic objectForKey:@"array"];
StudentModel *model = [array lastObject];
model.tel = _currentValue;
}
if([elementName isEqualToString:kRoot]){
//协议传值
[self.delegate parserFinished:_stuArray];
}
}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
self.currentValue = string;//属性的赋值必须用self.
}
//系统提供的所有参数都是自动释放的。
@end
解析的用法:
- (void)viewDidLoad
{
[super viewDidLoad];
self.navigationController.navigationBar.translucent = NO;
[self startSax];
//[self domParser];
}
- (void)startSax{
SaxXmlParser *parser = [[SaxXmlParser alloc]init];
parser.delegate = self;
[parser startParser];
[parser release];
NSLog(@"========%@",_tableArray);
}
//协议传值
- (void)parserFinished:(NSArray *)array{
[_tableArray addObjectsFromArray:array];
}