数据解析之---SAX

一.SAX

SAX 解析: 是一种基于事件回调的解析机制(主要通过代理方法进行解析), 逐行解析, 逐行读取数据, 逐行写入内存, 适合大数据的解析, 效率比较低, 系统解析就是这种方式.

  1. 在延展中定义属性

@property (nonatomic, retain) NSMutableArray *dataSource; // 存储学生对象

@property (nonatomic, retain) Student *stu; //保存当前的student对象

@property (nonatomic, copy) NSString *string;   //保存当前读取到的标签后的内容;


  1. 要记得懒加载和释放

//懒加载

- (NSMutableArray *)dataSource {

    if (!_dataSource) {

        self.dataSource = [[NSMutableArray alloc] initWithCapacity:1];

    }

    return [[_dataSource retain] autorelease];

}

  1. 解析的步骤和方法

用到了 NSXMLParserDelegate 代理, 需要服从代理和实现方法

//一个触发事件的方法

- (IBAction)saxRightItemAction:(UIBarButtonItem *)sender {

    [self.dataSource removeAllObjects];

    //1. 获取要解析的文件的路径

    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"xml"];

    //2. 根据文件路径, 初始化 NSData 对象

    NSData *data = [NSData dataWithContentsOfFile:filePath];

    //3. 创建解析工具对象

    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];

    //4. 设置代理, 监测解析过程

    parser.delegate = self;

    

    //设置命名空间

    parser.shouldProcessNamespaces = YES;

    

    //5. 开始解析

    [parser parse];

    //释放

    [parser release];

}


#pragma mark --- NSXMLParserDelegate

//1. 当读取到开始标签时触发

//parser: 解析工具对象, elementName标签名称; namespaceURI 命名空间的唯一标示; qName 标签名(m:Student); attributeDict 节点中的属性(position的内容)

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {

    //当读取到 Student 开始标签时, 创建 Student 对象

    if ([elementName isEqualToString:@"Student"]) {

        self.stu = [[[Student alloc] init] autorelease];

        self.stu.position = attributeDict[@"position"];


        NSLog(@"%@", qName);

        NSLog(@"%@", attributeDict);

    }

}


//2. 当读取到标签后的内容触发

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {

    self.string = string; // 保存读取到的标签后的内容

}


//3. 当读取到结束标签时触发

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {

    if ([elementName isEqualToString:@"name"]) {

        self.stu.name = self.string; // 这个时间节点中的数据 string 正是我们想要的数据

    } else if ([elementName isEqualToString:@"gender"]) {

        self.stu.gender = self.string;

    } else if ([elementName isEqualToString:@"age"]) {

        self.stu.age = self.string;

    } else if ([elementName isEqualToString:@"phone"]) {

        self.stu.phone = self.string;

    } else if ([elementName isEqualToString:@"motto"]){

        self.stu.motto = self.string;

    } else if ([elementName isEqualToString:@"Student"]) {

        //当读取到Student结束标签时, 将对象存储到数组中

        [self.dataSource addObject:self.stu];

        

    }

}

//4. 当解析结束时触发

- (void)parserDidEndDocument:(NSXMLParser *)parser {

    [self.tableView reloadData];

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值