解析的基本概念
XML数据结构
JSON数据结构
XML与JSON两种数据结构的优缺点
进行XML数据结构解析时使用到的SAX工具,DOM工具
进行JSON数据结构解析时使用到的第三方框架
解析的基本概念:所谓“解析”:从事先规定好的格式中提取数据
解析的前提:
![XML、JSON数据结构解析 XML、JSON数据结构解析](https://i-blog.csdnimg.cn/blog_migrate/6ec20cc30d05907b15c7db52a8c6dc98.gif)
提前约定好格式、数据提供方按照格式提供数据、数据获取方则按照格式获取数据
iOS开发常见的解析:XML解析、JSON解析
XML数据结构:Extensible Markup Language (可扩展标记语言)
数据交换、内容管理、用作配置文件
语法:
声明
节点使用一对标签标示。起始和结束标签
根节点是起始节点,只有一个。节点可以嵌套
节点可以有值。存储在一对儿标签中
XML解析-SAX工具
SAX:Simple API for XML
基于事件驱动的解析方式,逐行解析数据(采用协议回调机制)
NSXMLParser类
是iOS自带的XML解析类。采用SAX方式解析数据
解析过程由NSXMLParserDelegate协议方法回调
解析过程:开始标签->取值->结束标签->取值
首先写一个XML标签文件
#pragma mark 使用SAX解析数据
// 引入文件,设置当前标签,设置可变数组,存放所有学生对象
#import "JYFViewController.h"
#import "Student.h"
#import "GDataXMLNode.h"
#import "JSONKit.h"
@interface JYFViewController ()<</span>NSXMLParserDelegate>
{
NSString *_currentElementName; // 当前标签
}
@property (nonatomic, retain) NSMutableArray *allStudentArray; // 存放所有学生对象
@end
- (IBAction)xmlSax:(UIButton *)sender {
// 1.获取数据文件路径
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Students"ofType:@"txt"];
// 2.读取数据
NSData *data = [NSData dataWithContentsOfFile:filePath];
// 3.使用data创建XML的解析对象
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
// 4.设置代理
parser.delegate = self;
// 5.开始解析
[parser parse];
[parser release];
}
#pragma mark - NSXMLParserDelegate Methods
#pragma mark 开始解析文档
- (void)parserDidStartDocument:(NSXMLParser *)parser
{
// 初始化大数组
self.allStudentArray = [NSMutableArray array];
}
#pragma mark 开始解析标签
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
// 记录当前标签
_currentElementName = elementName;
// 判断当前标签是否是stu开标前
if ([elementName isEqualToString:@"stu"]) {
// 添加学生到数组中
Student *stu = [[Student alloc] init];
[_allStudentArray addObject:stu];
[stu release];
}
}
#pragma mark 取出标签中的值
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
// 刚刚添加的人
Student *stu = [_allStudentArray lastObject];
// 判断
if ([_currentElementName isEqualToString:@"number"]) {
stu.number = string;
}else if ([_currentElementName isEqualToString:@"name"]){
stu.name = string;
}else if ([_currentElementName isEqualToString:@"time"]){
stu.time = string;
}else if ([_currentElementName isEqualToString:@"address"]){
stu.address = string;
}
}
#pragma mark 结束解析标签
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
// 清空记录当前的标签名称
_currentElementName = nil;
}
#pragma mark 结束解析文档
- (void)parserDidEndDocument:(NSXMLParser *)parser
{
// 快速遍历打印数组中的所有数据
for (Student *stu in _allStudentArray) {
NSLog(@"%@ %@ %@", stu.name, stu.time, stu.address);
}
}
DOM工具
DOM:Document Object Model (文档对象模型)
#pragma mark - 使用DOM解析数据
- (IBAction)xmlDom:(UIButton *)sender {
// 1.获取文件路径
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Students"ofType:@"txt"];
// 2.读取到NSData中
NSData *data = [NSData dataWithContentsOfFile:filePath];
// 3.根据data创建解析对象
GDataXMLDocument *xmlDocument = [[GDataXMLDocument alloc] initWithData:dataoptions:0 error:nil];
// 4.获取根节点
GDataXMLElement *rootElement = xmlDocument.rootElement;
//NSLog(@"%@", rootElement);
// 5.获取所有的子元素
// 初始化大数组
self.allStudentArray = [NSMutableArray array];
// 遍历循环取值
for (GDataXMLElement *subElement in rootElement.children) {
// 创建学生,准备赋值
Student *stu = [[Student alloc] init];
// 取最小子节点,赋值给模型
for (GDataXMLElement *stuElement in subElement.children) {
NSLog(@"%@", stuElement);
// 使用kvc赋值
[stu setValue:stuElement.stringValue forKeyPath:stuElement.name];
}
// 将学生添加到大数组中
[_allStudentArray addObject:stu];
[stu release];
}
// 获取所有学生姓名
NSArray *nameArray = [xmlDocument nodesForXPath:@"//name" error:nil];
for (GDataXMLElement *nameElement in nameArray) {
NSLog(@"%@", nameElement.stringValue);
}
}
#pragma mark 解析json数据
首先创建数据模型
[
{
"number":1,
"name":"cuilaoshi",
"gender":"man",
"phone":"1453785789"
},
{
"number":2,
"name":"liulaoshi",
"gender":"nv",
"phone":"7543275342"
},
{
"number":3,
"name":"jialaoshi",
"gender":"man",
"phone":"73275342"
},
{
"number":4,
"name":"chanlaoshi",
"gender":"nv",
"phone":"75445676342"
}
]
- (IBAction)json:(UIButton *)sender {
// 1.获取文件路径
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Teachers"ofType:@"txt"];
// 2.使用NSData接收
NSData *data = [NSData dataWithContentsOfFile:filePath];
// 解析json数据
//NSArray *array = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
NSArray *array = [data objectFromJSONData];
NSLog(@"%@", array);
// 把字典转化为JSON字符串
NSDictionary *dict = @{@"key1": @[@"iojiogs", @"gjreio", @"geggerg"],
@"key2":@[@"jgijggr", @"goggf", @"nngerg"],
@"key3":@[@"hasgg", @"fewfwf", @"fewfwef"]
};
NSString *str = [dict JSONString];
NSLog(@"%@", str);
}