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