XML.JSON数据接口解析

来源:互联网 发布:vue.js highcharts 编辑:程序博客网 时间:2024/05/14 10:54
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