首先导入 资源文件
XML解析要遵循协议<NSXMLParserDelegate>, 注意设置代理
导入动态库 libxml2.tab,同时要修改下面这个--->找到库的路径
E929A301-E233-4046-9EC9-8A7815CFA828.png
NSXMLParserDelegate 协议 是iOS中使用系统的SAX解析使用的协议
@interface ViewController ()<NSXMLParserDelegate>
@property (nonatomic, strong) NSMutableArray *dataArray;
@property (nonatomic, strong) NSString *currentElement; //当前解析的标签
@end
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
// [NSBundle mainBundle] 代表的是左面那个文件夹栏
// [pathForResource:@"文件名" ofType:@"文件格式"]
1.获取XML_stu.txt文件的路径
NSString *path = [[NSBundle mainBundle] pathForResource:@"XML_stu" ofType:@"txt"];
2.通过文件路径 创建一个NSData对象
NSData *data = [NSData dataWithContentsOfFile:path];
3.SAX解析使用的类
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
4.指定代理人
parser.delegate = self;
5.开始解析
[parser parse];
}
1.开始解析
2.检测到开始标签
3.检测到标签中的值
4.检测到结束标签
5.结束解析
1.开始解析(执行一次)
- (void)parserDidStartDocument:(NSXMLParser *)parser{
#warning 初始化数据源数组
self.dataArray = [NSMutableArray array];
}
//参数一:传进的类
//参数二:标签的名字
//以下三个为nil,基本不会用到
//参数三:节点里面的命名空间(XMLns)
//参数四:qName
//参数五: attributeDict标签属性
2.检测到开始标签
- (void)parser:(NSXMLParser *)parser didStartElement:(nonnull NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName attributes:(nonnull NSDictionary<NSString *,NSString *> *)attributeDict{
#warning 给CurrentElement赋值
#warning 如果标签的名字是Student 则表示要创建一个model,并添加到数据源数组里面
self.currentElement = elementName;
if ([self.currentElement isEqualToString:@"student"]) {
Student *model = [Student new];
[self.dataArray addObject:model];
}
NSLog(@"element == %@", elementName);
}
//参数一:类
//参数二:标签中的值
3.检测到标签中的值(!!!! 在该方法中将值存入model的具体属性)
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
#warning 将检测到的值 存入model的具体属性
//#error 给哪个属性赋值(当前标签self.currentElement)
//#error 给哪个model赋值(数组的最后一个model赋值)
// [self.dataArray.lastObject setValue:string forKey:self.currentElement];
Student *student = self.dataArray.lastObject;
[student setValue:string forKey:self.currentElement];
NSLog(@"string == %@", string);
}
4.检测到结束标签
- (void)parser:(NSXMLParser *)parser didEndElement:(nonnull NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName{
self.currentElement = nil;
NSLog(@"endElement == %@", elementName);
}
5.结束解析
- (void)parserDidEndDocument:(NSXMLParser *)parser{
for (Student *stu in self.dataArray) {
NSLog(@"%@ %@ %@ %ld", stu.name, stu.gender, stu.hobby, stu.age);
}
}