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

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就是标签名(节点名)
//第三个参数:namespaceURI:命名空间的标识符  例如:,namespaceURI就是 l
//第四个参数:qualifiedName:命名空间的值,就是上面的 www.lanou3g.com
//第五个参数:attributeDict(字典类型):标签的属性 例如position就是标签的属性 attributeDict = {position:"愤青"}
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)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节点的创建  相当于
    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节点,结构如上
//    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解析的用法)