ios XML/Jason数据解析

来源:互联网 发布:台式电脑品牌推荐知乎 编辑:程序博客网 时间:2024/05/01 15:52


Sax解析是一种占用内存较小的解析方式,sax解析是随着文件的读取过程一条一条解析,一旦解析过程中文件出现错误,错误前所有的解析过的是可以保存的。

Dom解析把dom全部文件读入到内存中,然后使用dom的api遍历所有数据,检索想要的数据,这种方式比较消耗内存,对于手机应用来说并不推荐,而且一旦文件中有错误,Dom解析是无法解析数据的。

相对于sax解析,Dom比较直观,简单。在xml文档比较小的情况下也可以考虑使用dom方式。

//开始解析-(void)starParser{    //获取路径    NSString * path = [[NSBundle mainBundle] pathForResource:@"citys" ofType:@"xml"];       NSData * data = [[NSData alloc] initWithContentsOfFile:path];        NSXMLParser * paster= [[NSXMLParser alloc] initWithData:data];    //     现在去写协议    paster.delegate = self;    //     设置代理    //    开始解析    [paster parse];      }
协议前先建一个Model,一个数组用来存放获取的内容

Sax解析一般用到下面两个协议:

//开始的协议- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{//    从字段kCity开始    if ([elementName isEqualToString:kCity])    {//        model中添加数据        Model_sax * sax = [[Model_sax alloc] init];//      创建一个大数组 接受model        [_array addObject:sax];        [sax release];            }    //    给model的属性赋值开始了       if ([elementName isEqualToString:kName]) {        Model_sax * sax = [_array lastObject];        sax.name  = [attributeDict objectForKey:@"data"];                    }    if ([elementName isEqualToString:klatitude_e6]) {        Model_sax * sax = [_array lastObject];        sax.latitude_e6 = [attributeDict objectForKey:@"data"];                    }    if ([elementName isEqualToString:@"longitude_e6"]) {        Model_sax * sax = [_array lastObject];       sax.longitude_e6 = [attributeDict objectForKey:@"data"];             }    }

//结束协议- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{//    当字段是cities时候结束添加  把数组传给视图控制器( 代理传值吧)    if ( [elementName isEqualToString:kCities]) {        [self.mydelegate saxParserFinshWithArr:_array];        _secdArrblock(_array);    }    }
这样一次简单的xml 解析就完成了!


下面开始Dom解析的代码演示

-(void)DomPaeserAttributes{    NSString * path =  [[NSBundle mainBundle]pathForResource:@"citys" ofType:@"xml"];    NSData * data = [NSData dataWithContentsOfFile:path];    NSError * error = Nil;    GDataXMLDocument * document = [[GDataXMLDocument alloc] initWithData:data options:GDataXMLDocumentKind error:&error];    if (error) {        NSLog(@"error===%@",error);    }                //    获得根节点    GDataXMLElement * element= [document rootElement];            GDataXMLElement * citys = [[element children] lastObject];    NSArray * cityarr = [citys children];    for (GDataXMLElement * elements in cityarr) {                Model_dom * dom = [[Model_dom alloc] init];        [_arr addObject:dom];                NSArray * descriptarr = [elements children];        for (GDataXMLElement * value in descriptarr) {                  if ( [[value name]isEqualToString:@"name"]) {            //               获得节点中属性的 内容                            GDataXMLNode *node = [value attributeForName:@"data"];                                        NSString * str = [node stringValue];                      Model_dom * domvalue = [_arr lastObject];                      domvalue.name = str;                       }            if ( [[value name]isEqualToString:@"latitude_e6"]) {                                //               获得节点中属性的 内容                GDataXMLNode *node = [value attributeForName:@"data"];                                NSString * str = [node stringValue];                Model_dom * domvalue = [_arr lastObject];                domvalue.latitude_e6 = str;            }            if ( [[value name]isEqualToString:@"longitude_e6"]) {                                //               获得节点中属性的 内容                GDataXMLNode *node = [value attributeForName:@"data"];                                NSString * str = [node stringValue];                Model_dom * domvalue = [_arr lastObject];                domvalue.longitude_e6 = str;            }        }    }        }


 最后是Jason解析    看完上面的这个就很简单了

-(void)JsonParser{    NSString * path =  [[NSBundle mainBundle]pathForResource:@"citys" ofType:@"txt"];//    依然获取路径    NSData * data = [NSData dataWithContentsOfFile:path];    NSError * error = Nil;//    获取里面的内容    NSDictionary * dic= [NSJSONSerialization JSONObjectWithData:data options:(NSJSONReadingMutableContainers) error:&error];    if (error) {        NSLog(@"error jason ===%@",error);    }    NSLog(@"jason dic  ==%@",dic);    [_arr addObjectsFromArray:[dic objectForKey:@"cities"]];    }


0 0
原创粉丝点击