UI 13 数据解析 Parser DOM JSON

来源:互联网 发布:湖南卫视电视直播软件 编辑:程序博客网 时间:2024/05/22 15:56

Parser 解析
DOM 解析
JSON 解析
现在大部分都是使用JSON解析
这里写图片描述
stroyboard 里面只有三个button按钮, 分别代表这三种解析.

Parser解析

#import <Foundation/Foundation.h>#import "Student.h"@interface ParserXML : NSObject<NSXMLParserDelegate>// 用一条属性,数组,来装所有解析好的Model对象.@property(nonatomic, retain)NSMutableArray *stuArr;//用来临时保存节点内容的字符串.@property(nonatomic, copy)NSString *tempStr;// 给一个开始解析的方法,使用减号方法,就需要创建一个对象.使用+好方法,就省去了创建对象的步骤.- (void)startParser;@end
#import "ParserXML.h"#import "Student.h"@implementation ParserXML- (void)startParser{    // 根据文件名和类型,获取文件所在路径    NSString *parserPath = [[NSBundle mainBundle]pathForResource:@"Student" ofType:@"xml"];    // 把路径文件内容转换NSData对象保存    NSData *stuData = [NSData dataWithContentsOfFile:parserPath];    // 创建一个mxl的解析工具.    NSXMLParser *parser  = [[NSXMLParser alloc] initWithData:stuData];    // 需要设置解析工具的代理人.    parser.delegate = self;    // 开始解析    [parser parse];}#pragma mark 开始执行协议中的方法- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{// 这个方法只要一碰到节点系统就会自动走这个方法.    if ([elementName isEqualToString:@"Student"]) {        // 当碰到根节点时,需要对数组进行初始化.        self.stuArr = [NSMutableArray array];    }else if([elementName isEqualToString:@"student"]){        // 碰到二级节点student,意味着这是一个新的对象,需要创建一个对象来接收数据,并且放入到学生数组中.        Student *stu = [[Student alloc] init];        [self.stuArr addObject:stu];        [stu release];    }}- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{    //找到节点里面的内容时调用,需要用一个属性来保存对应的节点内容.    // 保存节点内容.    self.tempStr = string;}- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{   // 只要到节点结束的地方就会走这个方法.    // 没有操作完的对象在数组的最后一个.    Student *stu = [self.stuArr lastObject];    //赋值方法1://    if ([elementName isEqualToString:@"name"]) {//        stu.name = self.tempStr;//    }    //赋值方法2: KVC    [stu setValue:self.tempStr forKey:elementName];}
<Student>    <student>        <name>张三</name>        <sex></sex>        <age>22</age>        <hobby></hobby>    </student>    <student>        <name>李四</name>        <sex></sex>        <age>21</age>        <hobby>读书</hobby>    </student>    <student>        <name>王二麻子</name>        <sex></sex>        <age>32</age>        <hobby>看美女</hobby>    </student>    <student>        <name>刘鑫狗儿</name>        <sex></sex>        <age>23</age>        <hobby>高高姐</hobby>    </student></Student>

第二种 XML - DOM

#import "XML - DOM.h"@implementation XML___DOM+ (NSMutableArray *)DOMStart{    // 初始化一个用来装Model的容器.    NSMutableArray *stuarr = [NSMutableArray array];    // 将文件内容读取后转化成NAData.    NSString *path = [[NSBundle mainBundle]pathForResource:@"Student" ofType:@"xml"];    NSData *data = [NSData dataWithContentsOfFile:path];    // 用第三方进行数据解析.    //1.要解析数据 //2.没用 //3.错误信息    //错误信息设置成nil,但是如果有问题,nil马上会被错误内容替换.    GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil];    // 获取根节点.    GDataXMLElement *rootElement = [document rootElement];    // 找到根节点,找里面所有的student节点,装在一个数组中.    NSArray *arr = [rootElement elementsForName:@"student"];    //循环遍历所有符合条件的节点    for (NSInteger i = 0; i < arr.count; i++) {        GDataXMLElement *stu = arr[i];        // 创建学生对象        Student *tempStu = [[Student alloc] init];        //继续寻找节点,此处只寻找到了一个name的节点.        GDataXMLElement *stuElement = [[stu elementsForName:@"name"] lastObject];        NSString *nameString = [stuElement stringValue];        tempStu.name = nameString;        [stuarr addObject:tempStu];        [tempStu release];    }    return stuarr;}

第三种 JSON
也将其他两种方法的调用写出来啦.

- (IBAction)parser:(id)sender {    ParserXML *parser = [[ParserXML alloc] init];    [parser startParser];    for (Student *stu in parser.stuArr) {        NSLog(@"%@",stu.name);    }}- (IBAction)DOM:(id)sender {    NSMutableArray *arr = [XML___DOM DOMStart];    for (Student *stu in arr) {        NSLog(@"%@",stu.name);    }}// JSON 解析!- (IBAction)JSON:(id)sender {    // 对本地数据进行解析    NSString *path = [[NSBundle mainBundle]pathForResource:@"movielist" ofType:@"txt"];    NSData *data  = [NSData dataWithContentsOfFile:path];    //第二个参数指定一个可变的容器来接受解析之后的数据.    NSMutableDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];//    // 打印所有电影名//    NSMutableArray *arr = dic[@"result"];//    for (NSMutableDictionary *DIC in arr) {//        NSLog(@"%@",DIC[@"movieName"]);//    }    NSMutableArray *movieArr = [NSMutableArray array];    for (NSMutableDictionary *DIC in dic[@"result"]) {        Movie *movie = [[Movie alloc] init];        [movie setValuesForKeysWithDictionary:DIC];        [movieArr addObject:movie];        [movie release];    }}

好吧. 前两种方法太麻烦. 现在就是用JSON解析.

0 0
原创粉丝点击