UI 13 数据解析 Parser DOM JSON

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值