数据解析

补充:ARC和MRC是编译器的机制  

使用ARC:-fno-objc-arc

忽略ARC:-fobjc-arc

数据解析:

1.  XML:

     1.1 SAX:

第一步:获取存放xml数据的文件路径(NSBundle)

第二步:以NSData的形式获得数据

第三步:NSXMLParser 声明变量 初始化 利用data

第四步:遵守协议:<NSXMLParserDelegate>    设置代理

第五步:开启数据解析(必须写这一步)

// 按钮的点击事件
- (IBAction)buttonXML_SAX:(id)sender {
    // 第一步:获取存放xml数据的文件路径
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Students" ofType:@"xml"];
    // 第二步:以NSData的形式拿到数据
    NSData *data = [NSData dataWithContentsOfFile:filePath];
    // 第三步:用系统提供的类
    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
    // 第四步:设置代理,需要先遵守协议:<NSXMLParserDelegate>
    parser.delegate = self;
    // 第五步:开启数据解析  必须调用这个方法    数据解析的时候需要用代理方法解析
    [parser parse];
}

开始解析:-(void)parserDidStartDocument:(NSXMLParser *)parser

结束解析:-(void)parserDidEndDocument:(NSXMLParser *)parser
找开始节点:-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict

找结束节点:-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName

寻找相应数据:-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string

1. 无法打印数据:

@interface ViewController ()

{
    StudentModel *model;
    NSMutableDictionary *dic;
    NSString *key;
}
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}
- (IBAction)buttonXML_SAX:(id)sender {
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Students" ofType:@"xml"];
    NSData *data = [NSData dataWithContentsOfFile:filePath];
    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
    parser.delegate = self;
    [parser parse];
}

-(void)parserDidStartDocument:(NSXMLParser *)parser {
    // 开始解析
    self.arraySAX = [[NSMutableArray alloc] init];
}
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict {
    // 节点开始
    if ([elementName isEqualToString:@"student"]) {
        dic = [[NSMutableDictionary alloc] init];
        model = [[StudentModel alloc] init];
    }
    // 将elementName保存下来 后续的字典赋值会需要
    key = elementName;
    
}

-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
    // 找到相应节点的数据
    [dic setObject:string forKey:key];
}

-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
    // 节点结束:
    if ([elementName isEqualToString:@"student"]) {
        [model setValuesForKeysWithDictionary:dic];
        [self.arraySAX addObject:model];
    }
}

-(void)parserDidEndDocument:(NSXMLParser *)parser {
    //结束解析
    for (StudentModel *m in self.arraySAX) {
        NSLog(@"%@",m);
    }    
}

打印结果:(空格和回车将李晓...替换了)

2015-11-02 19:14:28.875 test-数据解析[5224:430839] (
    "\n        , \n         ,\n    ",
    "\n        , \n         ,\n    ",
    "\n        , \n         ,\n    ",
    "\n        , \n         ,\n    "
)
2.  修改一:

-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
    // 找到相应节点的数据
    if ([string rangeOfString:@"\n"].location == NSNotFound) {
        [dic setObject:string forKey:key];
    }
}
结果打印:

2015-11-02 19:24:19.746 test-数据解析[5299:439181] 李晓, 男 ,20
2015-11-02 19:24:19.747 test-数据解析[5299:439181] 李青海, 男 ,22
2015-11-02 19:24:19.748 test-数据解析[5299:439181] 周群, 男 ,25
2015-11-02 19:24:19.748 test-数据解析[5299:439181] 张三丰, 女 ,108
3.  修改二:

-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
    // 找到相应节点的数据 进行赋值  以便后续使用 
    currentString = string;
}

-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
    // 节点结束:
    
    // 强调:这里不能写成:[dic setObject:currentString forKey:key]  不然最后的那个值会为空(这个题里是age)
    // 可以打印测试一下:NSLog(@"key == %@,  elementName == %@",key , elementName);
    [dic setObject:currentString forKey:elementName];
    
    if ([elementName isEqualToString:@"student"]) {
        [model setValuesForKeysWithDictionary:dic];
        [self.arraySAX addObject:model];
    }
}
结果打印:

2015-11-02 19:50:27.904 test-数据解析[5450:456826] 李晓, 男 ,20
2015-11-02 19:50:27.904 test-数据解析[5450:456826] 李青海, 男 ,22
2015-11-02 19:50:27.904 test-数据解析[5450:456826] 周群, 男 ,25
2015-11-02 19:50:27.905 test-数据解析[5450:456826] 张三丰, 女 ,108

4.  修改三:

-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
    // 节点结束:
    
    // 根据model的属性 直接给model赋值, 不需要字典啦(前面的方法可以直接把字典去掉啦)
    if ([elementName isEqualToString:@"name"]) {
        model.name = currentString;
    }else if ([elementName isEqualToString:@"gender"]) {
        model.gender = currentString;
    }else if ([elementName isEqualToString:@"age"]) {
        model.age = currentString;
    }else if ([elementName isEqualToString:@"student"]) {
        [self.arraySAX addObject:model];
    }
}

结果打印:

2015-11-02 20:06:04.511 test-数据解析[5504:467470] 李晓, 男 ,20
2015-11-02 20:06:04.512 test-数据解析[5504:467470] 李青海, 男 ,22
2015-11-02 20:06:04.513 test-数据解析[5504:467470] 周群, 男 ,25
2015-11-02 20:06:04.513 test-数据解析[5504:467470] 张三丰, 女 ,108

     1.2 DOM: 


先导入:GDataXMLNode文件 ------- target Header Search Paths:/usr/include/libxml2 --------Other Linker Flags:导入:libxml2

C语言的动态链接库:libxml2.dylib

GDataXMLNode是Google提供的开源XML解析类,对libxml2.dylib进⾏了Objective-C的封装

设置忽略ARC(前面有设置的方法)

树状结构:

第一步:获取存数据文件的路径

第二步:通过NSData获取数据

第三步:声明GDataXMLDocument类型变量 用data

第四步:获取根节点----根据某个节点寻找里面的数据

第五步:遍历:获取各个值 -------赋给model -------赋给数组存储

- (IBAction)buttonXML_DOM:(id)sender {
    
    // 初始化数组属性 用来存储最终的结果
    self.dataArrayDOM =[[NSMutableArray alloc] init];
    
    // 第一步:获取文件的路径
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Students" ofType:@"xml"];
    // 第二步:data获取数据
    NSData *data = [NSData dataWithContentsOfFile:filePath];
    // 第三步:声明GDataXMLDocument变量
    GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil];
    
    // 取得上述文件的根节点
    GDataXMLElement *element = [document rootElement];
    // 根据student节点找里面的数据
    NSArray *array = [element elementsForName:@"student"];
    for (GDataXMLElement *elem in array) {
        // 获取名字
        GDataXMLElement *el1 = [[elem elementsForName:@"name"] lastObject];
        NSString *strName = [el1 stringValue];
        // 获取性别
        GDataXMLElement *el2 = [[elem elementsForName:@"gender"] lastObject];
        NSString *strGender = [el2 stringValue];
        // 获取年龄
        GDataXMLElement *el3 = [[elem elementsForName:@"age"] lastObject];
        NSString *strAge = [el3 stringValue];
        
        // 将获取的值给字典
        NSDictionary *dicDOM = @{@"name":strName, @"gender":strGender, @"age":strAge};
        StudentModel *modelDOM = [[StudentModel alloc] init];
        // KVC
        [modelDOM setValuesForKeysWithDictionary:dicDOM];
            [self.dataArrayDOM addObject:modelDOM];
    }
    // 遍历打印:
    for (StudentModel *model1 in self.dataArrayDOM) {
         NSLog( @"%@",model1);
    }
}
结果打印:

2015-11-02 21:09:43.830 test-数据解析[5912:509486] 李晓, 男 ,20
2015-11-02 21:09:43.831 test-数据解析[5912:509486] 李青海, 男 ,22
2015-11-02 21:09:43.831 test-数据解析[5912:509486] 周群, 男 ,25
2015-11-02 21:09:43.832 test-数据解析[5912:509486] 张三丰, 女 ,108

两种形式都需要重写父类方法:

-(NSString *)description {
   return [NSString stringWithFormat:@"%@, %@ ,%@", self.name, self.gender, self.age];
}

2. JSON:

文件格式:[{"name":"李晓","gender":"男","age":"23"},{"name":"李青海","gender":"男","age":"20"},{"name":"李青楠","gender":"男","age":"25"}]

2.1 Foundation:

#pragma mark *********** 1. JSON解析的第一种形式:Foundation ***********
- (IBAction)buttonJSON:(id)sender {
    // 1. 从bundle中取数据
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Students" ofType:@"txt"];
    NSData *data = [NSData dataWithContentsOfFile:filePath];
    
    //2. json解析: (将data中的数据转换成数组)
    NSArray *array = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
    
    // 3. 把拿到的数据中的字典转换成model类型(遍历)
    // 初始化属性 (数组)
    self.dataArray = [[NSMutableArray alloc] init];
    for (NSDictionary *dic in array) {
        StudentModel *model = [[StudentModel alloc] init];
        [model setValuesForKeysWithDictionary:dic];
        [self.dataArray addObject:model];
    }
    for (StudentModel *m in self.dataArray) {
        NSLog( @"%@,  %@,  %@",m.name, m.gender, m.age);
    }
}

结果打印:

2015-11-02 22:00:32.516 UI-Lesson15-JSON[6366:544230] 李晓    男    23
2015-11-02 22:00:32.518 UI-Lesson15-JSON[6366:544230] 李青海    男    20
2015-11-02 22:00:32.518 UI-Lesson15-JSON[6366:544230] 李青楠    男    25


2.2 JSONKit:

#pragma mark *********** 2. JSON解析的第一种形式:JSONKit ***********
- (IBAction)jsonKit:(id)sender {
    // 1. 从相应路径中获取数据
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Students" ofType:@"txt"];
    NSData *data = [NSData dataWithContentsOfFile:filePath];
    
    // 2. 将一堆数据转换成数组
    NSArray *array = [data objectFromJSONData];
    
    // 3. 遍历 将数组中的字典元素转换为model  再赋给数组属性
    self.dataArray1 = [[NSMutableArray alloc] init];
    for (NSDictionary *dic in array) {
        StudentModel *model = [[StudentModel alloc] init];
        [model setValuesForKeysWithDictionary:dic];
        [self.dataArray1 addObject:model];
    }
    for (StudentModel *mo in self.dataArray1) {
        NSLog(@"%@    %@    %@", mo.name, mo.gender, mo.age);
    }
    
}

结果打印和上述一样。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值