美文网首页
Senior进阶 网络之数据解析之XML解析和JSON解析的用法

Senior进阶 网络之数据解析之XML解析和JSON解析的用法

作者: 孤城99 | 来源:发表于2016-12-19 21:28 被阅读0次

    Senior进阶 网络之数据解析之XML解析和JSON解析的用法

    XML解析之SAX解析
    首先在视图控制器的.m文件延展中声明下列属性
        //存放所有的student节点
        @property (nonatomic,strong)NSMutableArray* allDataMArray;
        //将一个student转换为字典
        @property (nonatomic,strong)NSMutableDictionary *studentMDic;
        //存储节点中的值
        @property (nonatomic,strong) NSString *noteValueString;
    
    //SAX解析学习
    - (void)saxParser{
        //SAX解析:基于事件驱动的解析方式,逐行解析
        //第一步:获取文件的地址
        NSString* xmlPath = [[NSBundle mainBundle] pathForResource:@"demoXML1" ofType:@"xml"];
        //获取文件内容
        NSString* xmlString = [NSString stringWithContentsOfFile:xmlPath encoding:NSUTF8StringEncoding error:nil];
        //字符串转data类型
        NSData* xmlData = [xmlString dataUsingEncoding:NSUTF8StringEncoding];
        //获取解析对象
        //参数:需要解析的文件内容
        NSXMLParser* xmlParser = [[NSXMLParser alloc] initWithData:xmlData];
        //设置代理
        xmlParser.delegate = self;
        //开始解析,parser解析的过程为同步,当整个解析完成了,才会执行下一行的代码。
        BOOL isSuccess = [xmlParser parse];
        if (isSuccess) {
            NSLog(@"数据解析成功");
        }else{
            NSLog(@"数据解析失败");
        }
        //解析的过程不结束,就不会执行该打印
        NSLog(@"我在解析的最底下");
    }
    
    #pragma mark ---- parser 解析的代理方法
    //开始解析整个文档了
    - (void)parserDidStartDocument:(NSXMLParser *)parser{
        NSLog(@"开始解析整个文档了");
    
        //初始化外部的可变数组,准备存放解析好的student节点
        self.allDataMArray = [[NSMutableArray alloc] init];
    }
    
    //当碰到开始节点或者开始标签的时候会执行的代理方法
    //第一个参数:解析对象
    //第二个参数:elementName:标签名称  例如:<name> name就是标签名(节点名)
    //第三个参数:namespaceURI:命名空间的标识符  例如:<teacher xml:l="www.lanou3g.com">,namespaceURI就是 l
    //第四个参数:qualifiedName:命名空间的值,就是上面的 www.lanou3g.com
    //第五个参数:attributeDict(字典类型):标签的属性 例如<student position="愤青">position就是标签的属性 attributeDict = {position:"愤青"}
    - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict{
        NSLog(@"碰到开始标签----- %@",elementName);
    
        //当开始解析student节点的时候,说明我们要用到字典了,需要对字典进行初始化
        if ([elementName isEqualToString:@"student"]) {
            self.studentMDic = [[NSMutableDictionary alloc] init];
        }
    }
    //取出标签中的值
    //参数为:标签中的值
    - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
        NSLog(@"正在解析的标签的值为----- %@",string);
    
        //将结点的内容存储起来,以供节点解析结束时使用
        self.noteValueString = string;
    }
    //遇到当前正在解析的标签的结束标签
    - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
        NSLog(@"%@标签已经解析结束",elementName);
    
        //
        if ([elementName isEqualToString:@"name"]) {
            //说明name标签解析结束
            [self.studentMDic setObject:self.noteValueString forKey:elementName];
        }
        if ([elementName isEqualToString:@"age"]) {
            //说明age标签解析结束
            [self.studentMDic setObject:self.noteValueString forKey:elementName];
        }
        if ([elementName isEqualToString:@"gender"]) {
            //说明gender标签解析结束
            [self.studentMDic setObject:self.noteValueString forKey:elementName];
        }
        if ([elementName isEqualToString:@"student"]) {
            //说明一个student已经解析完成,说明一个字典已经完整,应该将字典存放到数组中
            [self.allDataMArray addObject:self.studentMDic];
        }
    }
    
    //整个文档解析结束
    - (void)parserDidEndDocument:(NSXMLParser *)parser{
        NSLog(@"整个文档解析结束");
    
        //当整个文档解析结束,说明所有的数据我们已经拿到,可以正常使用
        NSLog(@"self.allDataMArray ---- %@",self.allDataMArray);
    }
    //当解析出错的时候执行的代理方法
    - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError{
        NSLog(@"解析出现错误 ----- %@",parseError.description);
    }
    
    XML解析之DOM解析
    第一步:导入GDataXMLNode的(.h和.m)文件
    第二步:根据要求配置使用方法
    第三步:解析文件
        //DOM解析的学习  基于文档驱动的解析方式
    - (void)domParser{
    
        //需要获取解析的源文件
        //第一步:获取文件的地址
        NSString* xmlPath = [[NSBundle mainBundle] pathForResource:@"demoXML1" ofType:@"xml"];
        //获取文件内容
        NSString* xmlString = [NSString stringWithContentsOfFile:xmlPath encoding:NSUTF8StringEncoding error:nil];
        //字符串转data类型
        NSData* xmlData = [xmlString dataUsingEncoding:NSUTF8StringEncoding];
        //DOM解析
        //第一步:将源XML转换成树状结构的文档放在内存中,以供遍历获取每一个节点
        GDataXMLDocument *xmlDocument = [[GDataXMLDocument alloc] initWithData:xmlData encoding:NSUTF8StringEncoding error:nil];
        //第二步:获取根节点  相当于获取到了students节点
        GDataXMLElement *rootElement = [xmlDocument rootElement];
    
        //向现有的文档动态添加一个student节点
        //student节点的创建  相当于<student></student>
        GDataXMLElement* studentNote = [GDataXMLElement elementWithName:@"student"];
    
        //为student增加子节点
        GDataXMLElement* nameNote = [GDataXMLElement elementWithName:@"name" stringValue:@"ze an"];
        //添加到studentNote
        [studentNote addChild:nameNote];
    
        //为student增加age子节点
        GDataXMLElement *ageNote = [GDataXMLElement elementWithName:@"age"];
        ageNote.stringValue = @"22";
        //添加到studentNote节点上
        [studentNote addChild:ageNote];
    
        //为studentNote增加gender子节点
        GDataXMLElement *genderNote = [GDataXMLElement elementWithName:@"gender" stringValue:@"man"];
        //添加到studentNote上
        [studentNote addChild:genderNote];
    
        //将student节点加入到它的父节点中
        [rootElement addChild:studentNote];
    
        //第三步:获取我们需要的子节点
        //参数;我们需要获取的子节点的标签名
        NSArray *studentMArray = [rootElement elementsForName:@"student"];
        //初始化一个可变数组,准备存放所有的student转换成的字典
        NSMutableArray *allStudentsArray = [[NSMutableArray alloc] init];
    
    
        //第四步:遍历studentArray
        //studentNode 对应一个student节点
        /*
            <student>
                <name></name>
                <age></age>
                <gender></gender>
            </studnet>
        */
        //第一种:
        //没执行一次 循环体,就相当于获取了一个完整的student节点,结构如上
    //    for (GDataXMLElement *studentNote in studentMArray) {
    //        //�初始化一个字典
    //        NSMutableDictionary *studentDic = [[NSMutableDictionary alloc] init];
    //        //
    ////        NSString *name = [[[studentNote elementsForName:@"name"] firstObject] stringValue];
    //        //获取name的节点
    //        GDataXMLElement* nameElement = [studentNote elementsForName:@"name"].firstObject;
    //        //取出节点中的值
    //        NSString *name = nameElement.stringValue;
    //        //将name的值放入字典中
    //        [studentDic setObject:name forKey:@"name"];
    //        
    //        //获取age节点
    //        GDataXMLElement* ageElement = [studentNote elementsForName:@"age"].firstObject;
    //        //取出节点中的值
    //        NSString *age = ageElement.stringValue;
    //        //将age的值放入字典中
    //        [studentDic setObject:age forKey:@"age"];
    //        
    //        //获取gender节点
    //        GDataXMLElement* genderElement = [studentNote elementsForName:@"gender"].firstObject;
    //        //取出节点中的值
    //        NSString *gender = genderElement.stringValue;
    //        //将age的值放入字典中
    //        [studentDic setObject:gender forKey:@"gender"];
    //        
    //        //将字典添加到可变数组中
    //        [allStudentsArray addObject:studentDic];
    //    }
    
        //第二种
        for (GDataXMLElement *studentNote in studentMArray) {
            //遍历获取student所有的子节点
            NSArray *subStudentNode = [studentNote children];
            //初始化一个可变字典
            NSMutableDictionary *studentDic = [[NSMutableDictionary alloc] init];
            //遍历
            for (GDataXMLElement* subOfStudentNote in subStudentNode) {
                //获取节点的名称
                NSString *noteName = [subOfStudentNote name];
                //获取节点的值
                NSString *noteValue = [subOfStudentNote stringValue];
                //将值添加到字典中
                [studentDic setObject:noteValue forKey:noteName];
            }
            //将字典加入到可变数组中
            [allStudentsArray addObject:studentDic];
        }
    
    
        NSLog(@"allStudentsArray ---- %@",allStudentsArray);
    }
    
    JSON解析
    //JSON解析
    - (void)jsonParser{
        //获取源文件
        NSString* jsonPath = [[NSBundle mainBundle] pathForResource:@"DemoJson" ofType:@"json"];
        //
        NSString* jsonString = [NSString stringWithContentsOfFile:jsonPath encoding:NSUTF8StringEncoding error:nil];
        //字符串转换为二进制类型
        NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
        //Json解析
        NSDictionary* dic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingAllowFragments error:nil];
        NSLog(@"dic ==== %@",dic);
    }

    相关文章

      网友评论

          本文标题:Senior进阶 网络之数据解析之XML解析和JSON解析的用法

          本文链接:https://www.haomeiwen.com/subject/huztvttx.html