解析

XML : 可扩展标记语言 

功能 : 

1. 数据交换

2. 内容管理

3. 用作配置文件

 

语法 : 

1. 声明

2. 节点使用一对儿标签表示 : 起始和结束标签

3. 根节点是起始节点, 只有一个. 节点可以嵌套

4. 节点可以有值, 存储在一对儿标签中

XML 解析的几种方式

1. SAX 解析 :  Simple API for XML 一行一行解析 ( 采用协议回调机制 )

-- --代码实现 -- --

 

#import "ViewController.h"

#import "Student.h"

//NSXMLParserDelegate 协议 是iOS中使用系统的SAX解析使用的协议
@interface ViewController ()<NSXMLParserDelegate>
//数据源数组
@property (nonatomic, strong) NSMutableArray *dataArray;
//当前解析的标签
@property (nonatomic, copy) NSString *currentElement;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    self.view.backgroundColor = [UIColor orangeColor];
    
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    //[NSBundle mainBundle]代表的是左边那个文件夹栏
    //[pathForResource:@"文件名" ofType:@"文件格式"]; 也可以 [pathForResource:@"文件名.文件格式" ofType:nil];
    //获取XML_stu.txt文件的路径
    NSString *path = [[NSBundle mainBundle] pathForResource:@"XML_stu" ofType:@"txt"];
    //通过文件路径 创建一个NSData对象
    NSData *data = [NSData dataWithContentsOfFile:path];
    
    NSXMLParser *parser = [[NSXMLParser alloc]initWithData:data];
    //指定代理人µ
    parser.delegate = self;
    //开始解析
    [parser parse];
    
}
//开始解析文档
- (void)parserDidStartDocument:(NSXMLParser *)parser
{
#warning 初始化数据源数组
    self.dataArray = [NSMutableArray array];
}
//检测到开始标签
//第一个参数 : 类
//第二个参数 : elementName 标签的名字
//以下三个 基本不会使用到 , 所以基本为nil
//第三个参数 : 节点里面的命名空间 (xmlns)
//第四个参数 : qName
//第五个参数 : attrubuteDict 标签的属性
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict
{
#warning 给currentWlement赋值
    self.currentElement = elementName;
#warning 如果标签的名字是student 则表示 要创建一个model, 并添加到数据源数组里面
    if ([elementName isEqualToString:@"student"]) {
        Student *student = [[Student alloc] init];
        [_dataArray addObject:student];
    }
}
//检测到标签中的值
//第一个参数 : 类
//第二个参数 : 值
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
#warning 将检测到的值 存入model的具体属性
#warning 给哪个属性赋值
#warning 给哪个model赋值 数组的最后一个model赋值
    Student *student = self.dataArray.lastObject;
    [student setValue:string forKey:self.currentElement];
}
//检测到结束标签
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
    self.currentElement = nil;
    NSLog(@"endElement == %@",elementName);
}
//结束解析文档
- (void)parserDidEndDocument:(NSXMLParser *)parser
{
    for (Student *student in self.dataArray) {
        NSLog(@"name == %@, gender == %@, age == %ld, hobby == %@",student.name, student.gender, student.age, student.hobby);
    }
}

- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError
{
    
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

 

 

2. DOM 解析 : Document Object Model ( 文档对象模型 )

 

#import "SecondViewController.h"

#import "Student.h"

#import "GDataXMLNode.h"

@interface SecondViewController ()
//数据源数组
@property (nonatomic, strong) NSMutableArray *dataArray;

@end

@implementation SecondViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor magentaColor];
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    NSString *dataPath = [[NSBundle mainBundle] pathForResource:@"XML_stu" ofType:@"txt"];
    self.dataArray = [NSMutableArray array];
    NSData *data = [NSData dataWithContentsOfFile:dataPath];
    
    NSError *error = nil;
    //GDataXMLDocument XML的 DOM解析使用的列
    // 第一个参数 : 解析的data对象
    // 第二个参数 : 一般就是0
    // 第三个参数 : error信息
    GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithData:data options:0 error:&error];
    //获取到XML的根节点
    //获取到根节点里面所有的东西 也就是说 获取到students 里面包含的所有的东西
    GDataXMLElement *roomElement = [document rootElement];
//    NSLog(@"rootElement == %@",roomElement);
    for (GDataXMLElement *subElement in roomElement.children) {
        //这里获取到的subElement 保存的是student标签里面的内容 所以在这里创建对象
        Student *student = [Student new];
        for (GDataXMLElement *element in subElement.children) {
            //element 保存的就是student标签的所有子标签
            //根据标签的名字 给属性赋值
            //element.name 表示标签的名字
            //element.stringValue 表示标签的值
            if ([element.name isEqualToString:@"name"]) {
                student.name = element.stringValue;
            }
            if ([element.name isEqualToString:@"gender"]) {
                student.gender = element.stringValue;
            }
            if ([element.name isEqualToString:@"age"]) {
                student.age = [element.stringValue integerValue];
            }
            if ([element.name isEqualToString:@"hobby"]) {
                student.hobby = element.stringValue;
            }
        }
        [self.dataArray addObject:student];
    }
    for (Student *stu in self.dataArray) {
        NSLog(@"%@ %@ %ld %@", stu.name, stu.gender, stu.age, stu.hobby);
    }
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}



@end

JSON解析 ( JavaScript Object Notation )

功能 : 

1. 数据交换

2. 内容管理

3. 配置文件

-- -- 代码实现 -- -- 

#import "ThirdViewController.h"

@interface ThirdViewController ()

@end

@implementation ThirdViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    NSString *path = [[NSBundle mainBundle] pathForResource:@"JSON_stu" ofType:@"txt"];
    
    NSData *data = [NSData dataWithContentsOfFile:path];
    /**
     NSJSONReadingMutableContainers 返回一个数组或者字典
     NSJSONReadingMutableLeaves 返回一个字符串
     NSJSONReadingAllowFragments 返回一个任意类型的对象
     */
    NSArray *array = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
    NSLog(@"array == %@", array);
    for (NSDictionary *dic in array) {
        NSLog(@"dic == %@", [dic objectForKey:@"content"]);
    }
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}



@end

-- --代码实现 利用JSON解析展示在UITableView上 --

#import "FifthViewController.h"

@interface FifthViewController ()<UITableViewDelegate, UITableViewDataSource>
//数据源数组
@property (nonatomic, strong) UITableView  *tableView;

@property (nonatomic, strong) NSMutableArray *dataArray;

@end

@implementation FifthViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    NSString *path = [[NSBundle mainBundle] pathForResource:@"movie" ofType:@"txt"];
    NSData *data = [NSData dataWithContentsOfFile:path];
    
    NSArray *array = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
    
    self.dataArray = [NSMutableArray arrayWithArray:array];
    

    self.tableView = [[UITableView alloc] initWithFrame:[UIScreen mainScreen].bounds style:(UITableViewStylePlain)];
    [self.view addSubview:_tableView];
    self.tableView.delegate = self;
    self.tableView.dataSource = self;
    
    [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"cell"];
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return self.dataArray.count;
}

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
    NSString *string = [self.dataArray[section] objectForKey:@"title"];
    return string;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    //取出来的是数组包含的字典,再通过字典的key : data 取出来一个数组
    NSArray *array = [self.dataArray[section] objectForKey:@"data"];
    return array.count;
    
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];
    NSArray *arr = [self.dataArray[indexPath.section] objectForKey:@"data"];
    NSDictionary *dic = [arr objectAtIndex:indexPath.row];
    cell.textLabel.text = [dic objectForKey:@"title"];
    
    return cell;
}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}



@end

 

posted @ 2016-04-07 19:33  二十几岁的某一天  阅读(155)  评论(0)    收藏  举报