#import "ViewController.h"
#import "Student.h"//首先需要新建一个模型,继承自NSObject的类 Student;
@interface ViewController ()<NSXMLParserDelegate>
//声明变量
@property (nonatomic, strong) NSMutableArray *studentArray;
@property (nonatomic, strong) NSString *string;
@property (nonatomic, strong) Student *student;
@end
@implementation ViewController
//storyboard建立的模板,创建了一个button按钮,点击即可解析;saxBt是按钮的点击事件
- (IBAction)saxBt:(UIButton *)sender {
NSString *string = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"xml"];
//字符创转换格式为url
NSURL *url = [[NSURL alloc] initFileURLWithPath:string];
//创建解析类NSXMLParser
NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:url];
//接受解析类的代理
parser.delegate = self;
//开始解析
[parser parse];
}
#pragma mark ---- 解析数据的方法------<NSXMLParserDelegate>
- (void)parserDidStartDocument:(NSXMLParser *)parser{
NSLog(@"开始解析");
//初始化可变数组,以便存放模型
self.studentArray = [NSMutableArray arrayWithCapacity:0];
}
- (void)parserDidEndDocument:(NSXMLParser *)parser{
NSLog(@"结束解析");
//解析完成打印解析好的放在可变数组内部的模型数据
for (Student *student in self.studentArray) {
NSLog(@"%@",student); //模型内部 .m 文件需要重写(- (NSString *)description;)这个方法
}
}
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName attributes:(NSDictionary<NSString *, NSString *> *)attributeDict{
NSLog(@"遇到开始标签:%@",elementName);
if ([elementName isEqualToString:@"Student"]) {
self.student = [[Student alloc] init];
}
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName{
NSLog(@"遇到结束标签:%@",elementName);
if ([elementName isEqualToString:@"name"]) {
self.student.name = self.string;
}else if ([elementName isEqualToString:@"age"]){
self.student.age = self.string;
}else if ([elementName isEqualToString:@"gender"]){
self.student.gender = self.string;
}else if ([elementName isEqualToString:@"Student"]){
[self.studentArray addObject:self.student];
}
}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
NSLog(@"遇到数据内部的内容:%@",string);
self.string = string;
}
此解析方法速度慢,特点是逐行解析,但是优点数据内部如果有错误,错误之前的数据一样可以解析出来;这个NSXMLParser 类是有自己的方法,使用时需要接受协议并且指定代理对象
//XML的数据类型如下
<Students>
<Student>
<name>张三</name>
<age>18</age>
<gender>男</gender>
</Student>
<Student>
<name>王五</name>
<age>22</age>
<gender>男</gender>
</Student>
<Student>
<name>小花</name>
<age>18</age>
<gender>女</gender>
</Student>
<Student>
<name>六六</name>
<age>22</age>
<gender>女</gender>
</Student>
</Students>