数据解析

XML文件解析

xml文件示意图

SAX解析

利用的是系统的 NSXMLParser( xml分析者 类)
以驱动事件循环进行xml的解析(利用触发的代理方法进行解析)
真谛: 逐行解析

解析步骤:

1.创建分析人类 进行分析

    // 获取路径
    NSString *path = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"xml"];

    // 创建要分析的data(二进制对象)
    NSData *data = [NSData dataWithContentsOfFile:path];

    // 创建分析人
    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];

    // 驱动事件(设置代理)
    parser.delegate = self;

    // 开始分析
    [parser parse];

    // 释放
    [parser release];

2.实现代理方法

// 已经开始分析文件
- (void)parserDidStartDocument:(NSXMLParser *)parser
{
    // 此处应该初始化数组
    self.arr = [NSMutableArray array];
}

// 已经遇到开始节点
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict
{
    // 只有遇到节点名为 Student 的节点开始标签 才需初始化model
    if ([elementName isEqualToString:@"Student"]) {
        self.model = [[Model alloc] init];

    }

}

// 发现字符串
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
    // 此处需要保存发现的字符串
    self.string = string;

}

// 已经遇到结束节点
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
    // 此处应该对model进行赋值
    if ([elementName isEqualToString:@"name"]) {
        self.model.name = self.string;
    }

    if ([elementName isEqualToString:@"gender"]) {
        self.model.gender = self.string;
    }

    if ([elementName isEqualToString:@"age"]) {
        self.model.age = self.string;
    }

    if ([elementName isEqualToString:@"motto"]) {
        self.model.motto = self.string;
    }

    // model属性赋值完后还应该 给数组添加model
    if ([elementName isEqualToString:@"Student"]) {
        [self.arr addObject:self.model];
        [_model release];
    }
}

// 已经结束文件分析
- (void)parserDidEndDocument:(NSXMLParser *)parser
{
    // 这时装完所有的model 可以打印看看
    NSLog(@"%@",self.arr);


}

Dom解析

Dom解析 依靠第三方类库GDataXMLNode
GDataXMLNode类 依靠系统的libxml2 来使用
使用的时候 需要导入libxml2 框架 并且将Header Search Paths 设置成 /usr/include/libxml2
真谛:把所有的节点一次性读取 并转化为 树形结构 整体解析(与SAX解析的区别)

解析步骤:

自定义一个方法 用self 调用之

- (void)GDataXMLNodeUpData
{
    // 初始化文件对象
    NSString *path = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"xml"];
    NSData *data = [NSData dataWithContentsOfFile:path];

    // 创建一个空的错误对象
    NSError *error = nil;

    // 初始化文件获取数据
    GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithData:data options:0 error:&error];

    // 获取根节点
    GDataXMLElement *rootElement = [document rootElement];
    // rootElement包含根节点以及下面的所有数据
    NSLog(@"%@",[rootElement stringValue]);

    // 获取根节点下 student节点
    NSArray *elementArray = [rootElement elementsForName:@"Student"];

    self.array = [NSMutableArray array];

    // 便利数组 对每一个Student节点 继续化整为零
    for (GDataXMLElement *oneElement in elementArray) {

    // 调用方法     
        NSString *name = [self getvalueWith:oneElement elementName:@"name"];

        NSString *gender = [self getvalueWith:oneElement elementName:@"gender"];

        NSString *age = [self getvalueWith:oneElement elementName:@"age"];

        NSString *motto = [self getvalueWith:oneElement elementName:@"motto"];

        Model *model = [[Model alloc] init];
        model.name = name;
        model.gender = gender;
        model.age = age;
        model.motto = motto;

        // 装进数组
        [self.array addObject:model];
        [model release];

    }
}

// 调用方法
- (NSString *)getvalueWith:(GDataXMLElement *)oneElement elementName:(NSString *)elementName
{
    // 取出name节点数组
    NSArray *ElementArray = [oneElement elementsForName:elementName];

    // 从数组中取出name节点
    GDataXMLElement *element = ElementArray[0];

    // 把节点中的值取出来
    NSString *value = [element stringValue];

    return value;

}

JSON文件解析

方括号为数组 花括号为字典

解析json数据

真谛: 必须要知道 json文件最外层是什么

[ ]是数组 { }是字典

NSJSONSerialization类

    NSString *path = [[NSBundle mainBundle] pathForResource:@"area" ofType:@"json"];

    NSData *data = [NSData dataWithContentsOfFile:path];

    NSMutableArray *arr = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];

    self.dataArr = [NSMutableArray array];

    for (int i = 0; i < arr.count; i++) {
        AreaModel *model = [[AreaModel alloc] init];
        NSDictionary *oneDic = arr[i];
        [model setValuesForKeysWithDictionary:oneDic];
        [self.dataArr addObject:model];
        [model release];
    }

JSONKit类

    NSString *path = [[NSBundle mainBundle] pathForResource:@"area" ofType:@"json"];

    NSData *data = [NSData dataWithContentsOfFile:path];

    NSArray *array = [data objectFromJSONData];

    /...下面步骤同NSJSONSerialization类/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值