數(shù)據(jù)解析 -->XML-->SAX方式

  • 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);
    }
}

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容