ios XML/Jason数据解析



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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值