美文网首页我爱编程
数据解析-XML解析

数据解析-XML解析

作者: 9bf19a4010ab | 来源:发表于2016-08-11 02:08 被阅读45次

    今天来介绍一下XML数据解析的基础内容
    通俗的来讲 所谓XML数据解析就是将带有标签样式的数据 利用XML解析方法将数据解析成为赋值给model的数据

    我所了解的XML数据解析的方法有三种

    1. SAX解析
    2. DOM解析
    3. 利用一个三方(XMLReader 在githab上可以找得到)将XML数据解析成一个字典类型的数据

    1.对于SAX解析他是利用系统的类 (NSXMLParser)进行数据解析 所以这种方法和其他方法进行比较 效率较高 这种方式进行数据解析是逐行进行操作的 让我们结合代码来看

    首先我们得到一个XML的数据文件 获取这个文件路径 将其转化为NSData类型 然后创建NSXMLParser对象 将参数data填入(NSXMLParser我们要签这个类的协议)

    NSString *path = [[NSBundle mainBundle] pathForResource:@"stu_xml" ofType:@".xml"];
    NSData *data = [NSData dataWithContentsOfFile:path];
    NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithData:data];
    xmlParser.delegate = self;
    // 运行
    [xmlParser parse];
    

    // 在解析开始这个方法中 我们初始化数组
    - (void)parserDidStartDocument:(NSXMLParser *)parser {
    self.stuArray = [NSMutableArray array];
    }
    // 逐行解析 遇到节点头
    - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName attributes:(NSDictionary<NSString *, NSString *> *)attributeDict {
    // 逐行运行 将每一行的节点名赋值给定义的变量(记录节点 方便后期赋值)
    _currentElementName = elementName;
    // 遇到节点student 创建model
    if ([elementName isEqualToString:@"student"]) {
    Student *stu = [[Student alloc] init];
    [_stuArray addObject:stu];
    }
    }
    // 节点的值 (根据节点决定值)
    - (void)parser:(NSXMLParser *)parser foundCharacters:(nonnull NSString *)string {
    // string是"\n" "\t"
    if (_currentElementName) {
    Student *stu = [_stuArray lastObject];
    // 赋值 (将节点名和节点值 通过 setValue forKey 赋值给model)
    [stu setValue:string forKey:_currentElementName];
    }
    }

    // 逐行解析 遇到节点尾 (直到数据每行都运行完毕执行该方法)
    - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName {
    // 在节点尾 给节点名赋值为空
    _currentElementName = nil;
    }
    // 解析结束
    - (void)parserDidEndDocument:(NSXMLParser *)parser {
    NSLog(@"%@", _stuArray);
    }
    - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError {
    NSLog(@"解析失败%@", parseError);
    }

    1. DOM
      第二种解析方式 DOM(document Object model)解析 不是逐行解析
      关于GDataXMLNode的引入
    2. 引入.h .m 文件
    3. 引入系统libxml2.tbd
    4. 根据GDataXMLNode头文件 添加 /usr/include/libxml2
    5. 如果是ARC环境需要对该文件进行mrc编译(添加 -fno-objc-arc)
    self.DOMStuArray = [NSMutableArray array];
    NSString *path = [[NSBundle mainBundle] pathForResource:@"stu_xml" ofType:@".xml"];
    NSData *data = [NSData dataWithContentsOfFile:path];
    NSError *error = nil;
    // 创建GDataXMLDocument对象
    // 根据xml的Data数据生成一个树形结构的 document
    GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithData:data options:0 error:&error];
    // 根据document 获取根节点
    GDataXMLElement *rootElement = [document rootElement];
    // 根据根节点 获取子节点数组
    NSArray *rootChildrenElementArray = rootElement.children;
    // 遍历子节点数组 得到对应所有student节点
    for (GDataXMLElement *childElement in rootChildrenElementArray) {
        Student *stu = [Student new];
        NSLog(@"ARRAY %@", childElement);
        [self.DOMStuArray addObject:stu];
        // 遍历所有student的所有子节点
        for (GDataXMLElement *grandSonElement in childElement.children) {
            // .stringValue(节点值) .name(节点名)
            [stu setValue:grandSonElement.stringValue forKey:grandSonElement.name];
        }
    }
    

    3.用三方进行数据解析

    NSString *path = [[NSBundle mainBundle] pathForResource:@"stu_xml" ofType:@".xml"];
    NSData *data = [NSData dataWithContentsOfFile:path];
    NSError *error = nil;
    NSDictionary *dic = [XMLReader dictionaryForXMLData:data error:&error];
    //    NSLog(@"%@", dic);
    

    相关文章

      网友评论

        本文标题:数据解析-XML解析

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