• iOS-Senior6-数据解析(XML)


    1.解析的基本概念

    定义:从事先规定好的格式中提取数据

    解析前提:提前约定好格式,数据提供方按照格式提供数据,数据获取方则按照格式获取数据

    iOS开发常见的解析:XML解析,JSON解析

    2.XML数据结构

    XML:可扩展标记语言,主流数据格式之一,可以用来存储和传输数据。

    功能:数据交换,内容管理,用作配置文件

    语法:

    1.声明

    2.节点使用一对标签表示:起始和结束标签

    3.根节点是起始节点,只有一个,节点可以嵌套

    4.节点可以有值,存储在一对儿标签中

    实例:

    3.进行XML解析时使用到的SAX文件


    SAX:Simple API for XML.基于事件驱动的解析方式,逐行解析数据(采用协调回调机制)

    1.NSXMLParser是iOS自带的xml解析类,采用SAX方式解析数据

    2.解析过程由NSXMLParserDelegate协议方法回调

    3.解析过程:开始标签 ->取值 ->结束标签 ->取值

    源代码:

    系统SAX解析:(结果使用一个数组存储,里面包含每个字典)

    //1.获取文件路径

    NSString *filePath = [[NSBundle mainBundle] pathForResource@"Studentlnfor_xml" ofType:@"txt"];

    //2.获取出NSData类型的数据

    NSData *data = [NSData dataWithContentsOfFile:filePath];

    NSLog(@"data = %@",data);

    //3.设置SAX文件,并关联相关的xml文件

    NSXMLParser *parser = [[NSXMLParser alloc]initWithData:data];

    //4.设置代理

    parser.delegate = self;

    //5.开始解析

    [parser parser];

    #pragma mark - NSXMLParserDelegate协议方法

    //1.开始文档解析

    - (void)parserDidStartDocument:(NSXMLParser *)parser {

    //在这个方法里初始化数组(也可以懒加载)

     self.dataArray = [NSMutableArray array];

    }

    //2.开始解析标签

    -(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *>*)attributeDict {

    //根据需求需要的标签去获取相关的数据

    if([elementName isEqualToString:@"student"]) {

          Student *stu = [[Student alloc] init];

     //在这里不需要赋值操作,将数据对象添加到数组中

          [self.dataArray addObject:stu];

          NSLog(@"%@",self.dataArray);

       }

    //将当前的标签值传给刚才声明的一个属性

           self.currentElement = elementName;

    }

    #pragma mark - 3.解析标签中的内容然后赋值给对象

    - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {

    //从数组中取出相关的student对象,每次从数组中取出最后一个元素,保证每次取出最新的对象内容

           Student *stu = [self.dataArray lastObject];

    //kvc赋值

           [stu setValue:string forKey:self.currentElement];

    }

    #pragma mark - 4.结束标签

    - (void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{

             self.currentElement = nil;

    }

    #pragma mark - 5.结束文档解析

    - (void)parserDidEndDoucument:(NSXMLParser *)parser {

    //取出数组校验

    for(Student *student in self.dataArray) {

         NSLog(@"name = %@,gender = %@,age = %ld,hobby = %@",student.name,student.gender,student.age,student.hobby);

         }

    }

    #pragma mark - 6.错误处理

    - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError {

            NSLog(@"出错了:error = %@",parseError);

    }

    //第二种方法:使用DOM解析

    //使用第三方:GDataXMLNode(谷歌)

    1.需要引入一个动态库(libxml2.tbd)

    2.获取文件路径(同上)

    3.获取data数据(同上)

    //4.初始化存储数据的数组

    self.dataArray = [NSMutableArray array];

    //5.设置dom解析(创建解析文档)

    GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil];

    //6.获取根节点(文档为根节点)

    GDataXMLElement  *rootElement = document.rootElement;

    //7.变量获取相对应的子节点(studens是子节点,文档才是父节点)

      for(GDataXMLElement *studentElement in rootElement.children) {

         Student *student = [[Student alloc]init];

              for(GDataXMLElement *stuElement in   studentElement.children) {

          [stu setVslue:stuElement.stringValue forKey:stuElement];

        }

          [self.dataArray addObject:stu];

    //循环显示

        for(Student *student in self.dataArray) {

       NSLog(@"name = %@,gender = %@,age = %ld,hobby = %@",student.name,student.gender,student.age,student.hobby);

     }

    }

    3.使用DOM解析

    (1)设置Build Settings 里的Header Search Paths 添加 /user/include/libxml2

    设置Build Settings里的Other Linker Flags 添加-lxml2

    (2)设置Build Phases 里的GDataXMLNode,添加 -fno-objc - arc

     

  • 相关阅读:
    文件传输-一个大文件传输
    日志模块-logging模块
    加密模块hashlib
    面向对象进阶-反射
    面向对象
    模块和包
    作业-学生管理系统
    Java 链表反转
    Haoop MapReduce 的Partition和reduce端的二次排序
    Hadoop 笔记1 (原理和HDFS分布式搭建)
  • 原文地址:https://www.cnblogs.com/zhoulina/p/5486958.html
Copyright © 2020-2023  润新知