XML.JSON数据接口解析

XML解析
1. SAX 解析: Simple API for XML  利用代理的三个方法来实现逐行解析
创建:一个类 SAXXMLPaser
SAXXMLPaser.h
 
//优点: 数据损坏的时候 可以读取未损坏之前的数据
//缺点: 数据写错的时候就会直接结束  不继续解析
@interface SAXXMLPaser : NSObject<NSXMLParserDelegate]] > //xml SAX解析的代理协议
 
@property (nonatomic,retain)NSString * currentString;//储存每个叶子节点的字符串
 
@property (nonatomic,retain)NSMutableArray * dataArr;//存储所有的学生对象
 
//开始解析
- (void)startPaser;
 
 
 
 
 
 
 
SAXXMLPaser.m
 
 
- (instancetype)init
{
    self = [super init];
    if (self) {
        self.dataArr = [NSMutableArray array];
    }
    return self;
}
 
- (void)dealloc
{
   
    [self.dataArr release];
   
    [self.currentString release];
   
    [super dealloc];
   
}
 
- (void)startPaser
{
    //1.获得要解析的数据
    NSString * xmlPath = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"XML"];//文件途径
   
    NSData * data = [NSData dataWithContentsOfFile:xmlPath];
   
   
    //检验是否成功转换成字符串
    NSString * str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
 
    NSLog(@"%@",str);
   
    //xml SAX解析使用的类
    NSXMLParser * xmlPaser = [[NSXMLParser alloc] initWithData:data];
    //1.设置代理
    xmlPaser.delegate = self;
   
   
    //2.开始解析
   
    [xmlPaser parse];  
}
 
#warning  当他遇到前面的节点  节点头
 
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
    NSLog(@"%@",elementName);
   
    //通过判断节点名 student 来创建学生
    if([elementName isEqualToString:@"student"]) {
       
        Student * student = [[Student alloc] init];
       
        //将对象加入到数组中
        [self.dataArr addObject:student];
       
        [student release];
       
       
    }
  
}
 
#warning 遇到里面的内容的时候会走这个方法  节点内容
 
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
   
    NSLog(@"%@",string);
    //存储当前的字符串
    self.currentString = string;
 
}
 
#warning 当遇到后面那个节点的时候调用方法 
 
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
    Student * student = [self.dataArr lastObject];
   
    //将字符串
    if([elementName isEqualToString:@"name"]) {
         student.name = self.currentString;
    }
    else if ([elementName isEqualToString:@"sex"]) {
        student.sex = self.currentString;
       
    }
    else if([elementName isEqualToString:@"number"]) {
        student.number = [self.currentString integerValue];
    }
    NSLog(@"%@",elementName);
   
}




1.    DOMXML解析  节点状解析
(1)首先需要使用到第三方的类 GDataXMLNode.h GDataXMLNode.m
// libxml includes require that the target Header Search Paths contain
//
//   /usr/include/libxml2
//
// and Other Linker Flags contain
//
//   -lxml2
 
 
-1. 根据提示搜索 Header Search Paths  添加进去 /usr/include/libxml2
-2. 根据提示搜索 Other Linker Flags  添加进去 -lxml2
 
 
(2) 创建一个类 :DOMXMLPaser
 
DOMXMLPaser.h
 
- ( void )startPaser;
 
@property  ( nonatomic , retain ) NSMutableArray  * dataArr;
 
 
DOMXMLPaser.m
 
- ( instancetype )init
{
     self  = [ super   init ];
     if  ( self ) {
         self . dataArr  = [ NSMutableArray   array ];
    }
     return   self ;
}
 
- ( void )dealloc
{
    [ self . dataArr   release ];
   
    [ super   dealloc ];
    
}
- ( void )startPaser
{
   
     //1. 获取数据
     NSString   * domPath  = [[ NSBundle   mainBundle ]  pathForResource : @"Student"   ofType : @"XML" ];
   
     NSData  * data = [ NSData   dataWithContentsOfFile :domPath];
   
     NSString  * str = [[ NSString   alloc ]  initWithData :data  encoding : NSUTF8StringEncoding ];
   
     NSLog ( @"%@" ,str);
   
     //2. 解析数据
     NSError  * error =  nil ; // 创建一个错误指针
   
     GDataXMLDocument  * document = [[ GDataXMLDocument   alloc ]  initWithData :data  options : GDataXMLDocumentKind   error :&error];
   
     if  (error !=  nil ) {
       
         NSLog ( @" 错误信息 : %@" ,error);
       
    }
     // 解析 1. 获得结构的   根节点
     GDataXMLElement  * rootElement = [document  rootElement ];
   
     // 解析 2. 获得根节点的子节点
     // 根据节点名字获得
     NSArray  * arr = [rootElement  elementsForName : @"student" ];
   
     // 解析 3. 对数组进行遍历
   
     for  ( GDataXMLElement  * node  in  arr) {
       
         // 对子节点 node 的子节点 name  解析
         NSArray  * nameNodes = [node  elementsForName : @"name" ];
       
         GDataXMLElement  * nameNode = [nameNodes  lastObject ];
       
         // 将节点转变为字符串 ( 这个类自己带的 )
         NSString  * name = [nameNode  stringValue ];
       
       
         NSArray  * sexNodes = [node  elementsForName : @"sex" ];
       
         GDataXMLElement  * sexNode = [sexNodes  lastObject ];
       
         NSString  * sex = [sexNode  stringValue ];
       
       
       
         NSArray  * numberNodes = [node  elementsForName : @"number" ];
       
         GDataXMLElement  * numberNode = [numberNodes  lastObject ];
       
         NSInteger  number = [[numberNode  stringValue ]  integerValue ];
 
         NSLog ( @"name : %@ sex: %@,number : %d" ,name,sex,number);
 
}
 
}

一.JSON解析  不需要创建一个类
 
//1. 获取文件  参数1:文件名   参数2:文件类型
     NSString  * jsonPath = [[ NSBundle   mainBundle ]  pathForResource : @"JSON"   ofType : @"txt" ];
   
     NSData  * data = [ NSData   dataWithContentsOfFile :jsonPath];
   
     NSString  * str = [[ NSString   alloc ]  initWithData :data  encoding : NSUTF8StringEncoding ];
   
     NSLog ( @"%@" ,str);
   
   
     //2. 解析
     NSError  * error =  nil ;
   
     NSMutableArray   * arr = [ NSJSONSerialization   JSONObjectWithData :data  options : NSJSONReadingMutableContainers   error :&error];
     // 将字典或者字符串   转换为 JSON 类型的
//    NSJSONSerialization dataWithJSONObject:<#(id)#> options:<#(NSJSONWritingOptions)#> error:<#(NSError **)#>
   
     NSLog ( @"%@" ,arr);
   
   
     for  ( NSMutableDictionary  * dic   in  arr) {
       
         Student  * student = [[ Student   alloc ]  init ];
       
        student. name  = [dic  objectForKey : @"name" ];
       
        student. sex  = [dic  objectForKey : @"sex" ];
       
        student. number  = [[dic  objectForKey : @"number" ]  intValue ];
       
         NSLog ( @"%@    %@    %d" ,student. name ,student. sex ,student. number );
       
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值