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> 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);
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,440评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,814评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,427评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,710评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,625评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,014评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,511评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,162评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,311评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,262评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,278评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,989评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,583评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,664评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,904评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,274评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,856评论 2 339

推荐阅读更多精彩内容