XML數據結構 SAX 解析

SAX解析
SAX:Simple API for XML。基於事件驅動的解析⽅方式,逐⾏行解析 數據。(採⽤用協議回調機制)

NSXMLParser類
NSXMLParser是iOS⾃自帶的XML解析類。採⽤用SAX⽅方式解析數據。
解析過程由NSXMLParserDelegate協議⽅方法回調
解析過程:開始標籤->取值->結束標籤->取值

<?xml version = "1.0" encoding = "UTF-8"?>
<students>
    <student>
        <name>yadong</name>
        <sex>man</sex>
        <phone>18310057255</phone>
    </student>

    <student>
        <name>kelin</name>
        <sex>man</sex>
        <phone>18410057255</phone>
    </student>

    <student>
        <name>marry</name>
        <sex>woman</sex>
        <phone>18510057255</phone>
    </student>
</students>
#import "ViewController.h"
#import "StudentModal.h"

@interface ViewController () <NSXMLParserDelegate>
{
    // 用來記錄當前正在操作的標籤
    NSString *_currentElement;
}

@property (nonatomic, strong) NSMutableArray *xmlSAXArray;

@end
- (IBAction)XMLSAXBtttonDidClicked:(UIButton *)sender {

    // 1、拿到 xml 文件的路徑
    NSString *path = [[NSBundle mainBundle] pathForResource:@"myData" ofType:@"xml"];

    // 2、根據文件路徑獲取文件的內容
    NSData *data = [[NSData alloc] initWithContentsOfFile:path];

    // 3、根據 data 初始化一個 NSXMLParser 對象
    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];

    // 4、設置 NSXMLParser 對象的相關屬性
    // 是否處理命名空間
    [parser setShouldProcessNamespaces:NO];
    // 是否設置報告處理(前綴)
    [parser setShouldReportNamespacePrefixes:NO];

    // 5、設置代理
    parser.delegate = self;

    // 6、開始解析(調用)
    [parser parse];
}

實現 NSXMLParser 代理方法
開始解析(打開文檔)

- (void)parserDidStartDocument:(NSXMLParser *)parser
{
    // 初始化數組
    self.xmlSAXArray = [NSMutableArray array];
    NSLog(@"打開文檔");
}

打開標籤

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
    if ([elementName isEqualToString:@"student"]) {
        StudentModal *modal = [[StudentModal alloc] init];
        [self.xmlSAXArray addObject:modal];
    }
    _currentElement = elementName;
    NSLog(@"打開標籤%@",elementName);
}

取值

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
    StudentModal *modal = [self.xmlSAXArray lastObject];
    if ([_currentElement isEqualToString:@"name"]) {
        modal.name = string;
    } else if ([_currentElement isEqualToString:@"sex"]) {
        modal.sex = string;
    } else if ([_currentElement isEqualToString:@"phone"]) {
        modal.phoneNumber = string;
    }
    NSLog(@"取值%@", string);
}

關閉標籤

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
    _currentElement = nil;
    NSLog(@"關閉標籤%@",elementName);
}

關閉文檔

- (void)parserDidEndDocument:(NSXMLParser *)parser
{
    // 打印驗證
    for (StudentModal *stu in self.xmlSAXArray) {
        NSLog(@"%@,%@,%@", stu.name, stu.sex, stu.phoneNumber);
    }

    NSLog(@"關閉文檔");
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章