- SAX解析
首先導入 資源文件
XML解析要遵循協(xié)議<NSXMLParserDelegate>, 注意設置代理
導入動態(tài)庫 libxml2.tab,同時要修改下面這個--->找到庫的路徑

E929A301-E233-4046-9EC9-8A7815CFA828.png
NSXMLParserDelegate 協(xié)議 是iOS中使用系統(tǒng)的SAX解析使用的協(xié)議
@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.通過文件路徑 創(chuàng)建一個NSData對象
NSData *data = [NSData dataWithContentsOfFile:path];
3.SAX解析使用的類
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
4.指定代理人
parser.delegate = self;
5.開始解析
[parser parse];
}
- 使用SAX解析的時候需要調(diào)用 5 個方法
1.開始解析
2.檢測到開始標簽
3.檢測到標簽中的值
4.檢測到結(jié)束標簽
5.結(jié)束解析
1.開始解析(執(zhí)行一次)
- (void)parserDidStartDocument:(NSXMLParser *)parser{
#warning 初始化數(shù)據(jù)源數(shù)組
self.dataArray = [NSMutableArray array];
}
//參數(shù)一:傳進的類
//參數(shù)二:標簽的名字
//以下三個為nil,基本不會用到
//參數(shù)三:節(jié)點里面的命名空間(XMLns)
//參數(shù)四:qName
//參數(shù)五: 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 則表示要創(chuàng)建一個model,并添加到數(shù)據(jù)源數(shù)組里面
self.currentElement = elementName;
if ([self.currentElement isEqualToString:@"student"]) {
Student *model = [Student new];
[self.dataArray addObject:model];
}
NSLog(@"element == %@", elementName);
}
//參數(shù)一:類
//參數(shù)二:標簽中的值
3.檢測到標簽中的值(!!!! 在該方法中將值存入model的具體屬性)
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
#warning 將檢測到的值 存入model的具體屬性
//#error 給哪個屬性賦值(當前標簽self.currentElement)
//#error 給哪個model賦值(數(shù)組的最后一個model賦值)
// [self.dataArray.lastObject setValue:string forKey:self.currentElement];
Student *student = self.dataArray.lastObject;
[student setValue:string forKey:self.currentElement];
NSLog(@"string == %@", string);
}
4.檢測到結(jié)束標簽
- (void)parser:(NSXMLParser *)parser didEndElement:(nonnull NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName{
self.currentElement = nil;
NSLog(@"endElement == %@", elementName);
}
5.結(jié)束解析
- (void)parserDidEndDocument:(NSXMLParser *)parser{
for (Student *stu in self.dataArray) {
NSLog(@"%@ %@ %@ %ld", stu.name, stu.gender, stu.hobby, stu.age);
}
}