#import "ViewController.h"
#import "Student.h"
//一共要3步.第一引入libxml2.tbd//2.-fno-objc-arc//3./usr/include/libxml2
@interface ViewController ()<NSXMLParserDelegate>
@property(nonatomic,strong)NSString *currentlement;//存放當(dāng)前節(jié)點(diǎn)
@property(nonatomic,strong)NSMutableArray *array;//存放解析出來的模型
@end
@implementation ViewController
-(NSMutableArray *)array{
if (!_array) {
_array = [NSMutableArray array];
}return _array;
}
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"SAX解析");
//1.獲取文件路徑
NSString *filepath = [[NSBundle mainBundle]pathForResource:@"XML_stu" ofType:@"txt"];
//2.創(chuàng)建data
NSData *data = [NSData dataWithContentsOfFile:filepath];
//3.創(chuàng)建解析對(duì)象
NSXMLParser *parser =[[NSXMLParser alloc]initWithData:data];
//4.遵循協(xié)議設(shè)置代理
parser.delegate = self;
//5.開始解析
[parser parse];
}
//實(shí)現(xiàn)協(xié)議方法
//1.開始解析
-(void)parserDidStartDocument:(NSXMLParser *)parser{
NSLog(@"開始解析");
}
//2.開始解析標(biāo)簽-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary*)attributeDict{
//獲取當(dāng)前節(jié)點(diǎn)
NSLog(@"%@",elementName);
self.currentlement =elementName;
//這一步的作用是根據(jù)節(jié)點(diǎn)提供的數(shù)據(jù),來創(chuàng)建對(duì)應(yīng)的modle(沒有復(fù)制過程,只是創(chuàng)建模型)
if ([elementName isEqualToString:@"student"]) {
//初始化一個(gè)學(xué)生對(duì)象
Student *stu =[[Student alloc]init];
[self.array addObject:stu];
}
//3.讀取標(biāo)簽的值
-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
NSLog(@"%@",string);
//我們需要數(shù)組里面最后一個(gè)值
Student *stu =self.array.lastObject;
//使用KVC編碼賦值
[stu setValue:string forKey:self.currentlement];
}
//4.結(jié)束標(biāo)簽解析
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
NSLog(@"%@",elementName);
self.currentlement =nil;
}
//5.結(jié)束文檔解析
-(void)parserDidEndDocument:(NSXMLParser *)parser{
NSLog(@"文檔解析結(jié)束");
for (Student *stu in self.array) {
NSLog(@"%@",stu);
}
}
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end