您的位置:首页 > 移动开发 > IOS开发

iOS讲解迷惑深入浅出之SAX解析和JSON 解析

2015-09-15 14:49 239 查看
XML的SAX解析

NSXMLParser 分析XML文件
<span style="font-size:14px;">- (void)setUpDataXMLParser
{
   
    // 3. 创建路径
    NSString *path = [[NSBundlemainBundle]pathForResource:@"Student"ofType:@"xml"];
   
    // 2. NSData存储数据,以二进制形式存储
    NSData *data = [NSDatadataWithContentsOfFile:path];
   
    // 1. 创建一个分析人 类
    NSXMLParser *parser = [[NSXMLParseralloc]initWithData:data];
   
    // 设置代理
    parser.delegate = self;
   
    // 开始分析(利用协议方法,进行分析,去遵守协议NSXMLParserDelegate)
    [parser parse];
   
    // 释放分析人
    [parser release];
   
    NSLog(@"我在这里释放行吗?");
}

/**
 *  执行顺序:
    1. 开始分析: [parser parse];
 // 开始代理方法的实现
    1. 开始分析文件
    2. 开始遇到节点
    3. 发现字符
    4. 结束遇到节点
    5. 结束分析文件
 */

/***************************************************************/

/**
 * 把XML数据保存到model需要的操作
 1. 把数据取出来
 2. 装进model
 3. 把model装进数组,备用
 
 
 1. 从什么位置初始化数组:开始分析文件位置
 2. 从什么位置初始化model:开始遇到节点
    // 从什么位置可以拿出数据: 4.发现字符
 3. 从什么位置给model赋值:   5.结束节点
 
4. 从什么位置可以打印出数组: 已经结束分析文件(最后执行)
 
 */

#pragma mark - NSXMLParser代理方法
// 1. 已经开始分析文件 (最先执行),这个方法值只走一次
// 在这个方法里面初始化数组
- (void)parserDidStartDocument:(NSXMLParser*)parser
{
    // 初始化数组
    self.dataArray= [NSMutableArrayarray];
   
    NSLog(@"已经开始分析文件");
}

// 2. 已经结束分析文件 (最后执行)
//
- (void)parserDidEndDocument:(NSXMLParser*)parser
{
    NSLog(@"已经结束分析文件");
   
    NSLog(@"%@",self.dataArray);
}

// 3. 开始遇到节点
// 初始化model
- (void)parser:(NSXMLParser*)parser didStartElement:(NSString*)elementName namespaceURI:(NSString*)namespaceURI qualifiedName:(NSString*)qName attributes:(NSDictionary*)attributeDict
{
    // 初始化model
    // Student 是内层的节点, // self.model 这个model是在本类中声明的
    if ([elementName isEqualToString:@"Student"]) {
        self.model= [[StudentModelalloc]init];
    }
   
    //NSLog(@"开始遇到节点");
    NSLog(@"<%@>", elementName);//节点名字
}

// 4. 发现字符, 逐行发现
// 拿出数据
- (void)parser:(NSXMLParser*)parser foundCharacters:(NSString*)string
{
    // 保存字符串 , self.string也是被类声明的 nsstring类型的
    self.string= string;// string就是<></>之间的内容
   
//    NSLog(@"发现字符");
    NSLog(@"string: %@", string);
}

// 5. 结束节点
// 给model赋值
- (void)parser:(NSXMLParser*)parser didEndElement:(NSString*)elementName namespaceURI:(NSString*)namespaceURI qualifiedName:(NSString*)qName
{
   
    // 给model赋值
    if ([elementNameisEqualToString:@"name"]) {//如果节点的名字等于
        self.model.name=self.string;
    } else if ([elementName isEqualToString:@"gender"]) {
        self.model.gender=self.string;
    } else if ([elementName isEqualToString:@"age"]) {
        self.model.age=self.string;
    } else if ([elementName isEqualToString:@"motto"]) {
        self.model.motto=self.string;
    } else if ([elementName isEqualToString:@"Student"]) {
        // 节点等于Student的时候一个model就赋值完成了,可以装进数组了
        [self.dataArrayaddObject:self.model];
       
        [_model release]; //装进数组后就可以释放了
    }
   
    //NSLog(@"遇到节点结束触发");
    NSLog(@"</%@>", elementName);
} </span>


XML格式的DOM解析

<span style="font-size:14px;">/******************** Dom解析 一次性解析完成 **************************/
// Dom解析
// 使用 GDataXmlNode这个类库来实现(第三方类库, 谷歌写的类库)
// 直接导入类库报错
// 报错原因: GDataXmlNode 基于 libxml来写的,所以必须把libxml框架导入工程里面
- (void)setUpDataGDataXmlNode
{
    // 创建路径
    NSString *path = [[NSBundlemainBundle]pathForResource:@"Student"ofType:@"xml"];
    // 转换成NSData
    NSData *data =[NSDatadataWithContentsOfFile:path];
    // 利用XMLNode类进行Dom解析
    // 用data初始化管理文件的对象,转化成树形结构
    // <#(NSError **)#> 如果解析失败可以打印出理由, 需要传入&error
   
    NSError *error =nil;
    GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithData:dataoptions:0error:&error];
   
    // 2. 获取根节点
    GDataXMLElement *rootElement = [document rootElement];
    //NSLog(@"%@", rootElement);
   
    // 3. 获取根节点下Student节点(Student 下面有好多Student节点, 获取气候放到数组里面)
    NSArray *stusArray = [rootElement elementsForName:@"Student"];
    //NSLog(@"%@", stusArray);
   
   
    // 循环外面初始化一下数组 用来保存model
    self.dataArray= [NSMutableArrayarray];
   
    // 遍历Student节点的数组
    for (inti =0; i < stusArray.count; i++) {
        // 取出每一个Student节点
        GDataXMLElement *oneStudentElement = stusArray[i];
//       
//        // 取出oneStudentElement节点下的name的数组(这个数组里面存放的是节点,数据类型是GDataXMLElement类型)
//        NSArray *nameArray = [oneStudentElement elementsForName:@"name"];
//        NSLog(@"nameArray: %@", nameArray);
//        
//        // 取出name节点,
//        GDataXMLElement *nameElement = [nameArray firstObject]; //第0个元素
//        
//        // 转化为字符串
//        NSString *name = [nameElement stringValue];
//        NSLog(@"name: %@", name);
//        
//        
//        
//        // 取出oneStudentElement节点下的gender的数组
//        NSArray *genderArray = [oneStudentElement elementsForName:@"gender"];
//        // 取出gender节点
//        GDataXMLElement *genderElement = genderArray[0];
//        // 转化为字符串
//        NSString *gender = [genderElement stringValue];
//        NSLog(@"gender: %@", gender);
//        
//        
//        NSArray *ageArray = [oneStudentElement elementsForName:@"age"];
//        GDataXMLElement *ageElement = ageArray[0];
//        NSString *age = [ageElement stringValue];
//        
//        NSArray *mottoArray = [oneStudentElement elementsForName:@"motto"];
//        GDataXMLElement *mottoElement = [mottoArray firstObject];
//        NSString *motton = [mottoElement stringValue];
//   
       
// 三次次调用封装的方法 
        NSString*name = [selfbackStringWithElement:oneStudentElementelementName:@"name"];
        NSString *gender = [self backStringWithElement:oneStudentElement elementName:@"gender"];
        NSString *age = [self backStringWithElement:oneStudentElement elementName:@"age"];
        NSString *motto = [self backStringWithElement:oneStudentElement elementName:@"motto"];
   
        // 给model赋值
        // 初始化model
        StudentModel *model = [[StudentModel alloc] init];
        model.name = name;
        model.gender = gender;
        model.age = age;
        model.motto = motto;
       
        // 把model装进数组
        [self.dataArrayaddObject:model];
        [model release];
       
    }
}

// 封装的方法 返回节点中的字符串
- (NSString *)backStringWithElement:(GDataXMLElement*)element elementName:(NSString*)elementName
{
    // 取出oneStudentElement节点下的name的数组
    NSArray *nameArray = [elementelementsForName:elementName];
    NSLog(@"nameArray: %@", nameArray);
   
    // 取出name节点
    GDataXMLElement *nameElement = [nameArray firstObject];//第0个元素
   
    // 转化为字符串
    NSString *name = [nameElementstringValue];
  
    return name;
   
}

/*********** Dom解析结束  *************************/
</span>


json解析
JSON 数据结构, 99%的公司都在用, 用系统再带的json解析, 不要用jsionkit
<span style="font-size:14px;">// JSON 解析数据 上面的教师的数据
- (void)setUpJson
{
    // 获取路径
    NSString *path = [[NSBundlemainBundle]pathForResource:@"Teacher"ofType:@"json"];
    // 变成dada
    NSData *data = [NSDatadataWithContentsOfFile:path];
   
    // 把data转化成可变数组或者可变字典(是字典还是数组,要看json最外层是什么)
   
    // NSJSONSerialization json使用的类
    NSError *error =nil;
    NSMutableArray *dataArray = [NSJSONSerializationJSONObjectWithData:dataoptions:NSJSONReadingMutableContainerserror:&error];
    //NSLog(@"%@", dataArray);
   
    self.dataArray= [NSMutableArrayarray];
    // 剥��香蕉
    for (NSDictionary*dicin dataArray) {
        TeacherModel *model = [[TeacherModel alloc] init];
        [model setValuesForKeysWithDictionary:dic];
        [self.dataArrayaddObject:model];
        [model release];
    }
    NSLog(@"%@",self.dataArray);
   
   
}
[]

// json解析城市数据
- (void)setUpDataJsonCity
{
    NSString *path = [[NSBundlemainBundle]pathForResource:@"area"ofType:@"json"];
    NSData *data = [NSDatadataWithContentsOfFile:path];
   
    NSError *error =nil;
    // 把data转化成可变字典或数组,因为城市数据最外层是数组,所以用
    NSMutableArray *dataArray = [NSJSONSerializationJSONObjectWithData:dataoptions:NSJSONReadingMutableContainerserror:&error];
    self.dataArray= [NSMutableArrayarray];
   
    /*******  JSONKIT 解析  *********/
    // 导入第三方类库
    //NSMutableArray *jsonKitArray = [data objectFromJSONData]; //等价于 上面的   NSJSONSerialization解析
    /********        ************/
   
   
   
    // 剥香蕉
    // 遍历数组, 因为数组里面的元素类型是NSDictionary类型,所以遍历的时候是(NSDictionary *dic in dataArray)
    for (NSDictionary*dicin dataArray) {
        CityModel *model = [[CityModel alloc] init];//构建model
        [model setValuesForKeysWithDictionary:dic];//给model进行KVC赋值,把字典装进model
        [self.dataArrayaddObject:model];//把model装进数组
    }
   
}</span>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: