1:什么是XML解析
Extensible Markup language(可扩展标记语言)
Plist文件就是用XML格式存储文件的
</名字>表示结束标签
2:XML解析的几种方式
SAX:一行一行的去解析,费时
SAX,全称Simple API for XML,既是一种接口,也是一种软件包。它是一种XML解析的替代方法。SAX不同于DOM解析,它逐行扫描文档,一边扫描一边解析。由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中,这对于大型文档的解析是个巨大优势。
DOM:建立树形的结构,比SAX快很多
3:什么是JSON解析
JSON(JavaScript Object Notation)轻量级的数据交换格式
JSON解析的几种方式
JSONObjectWithData: options: error: //使用缓冲区数据解析JSON
writeJSONObject: toStream: options: error: //使用文件流的形式解析JSON
XML解析:
SAX解析使用的协议:NSXMLParserDelegate
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
//获取XML_stu.txt文件路径
NSString *path = [[NSBundle mainBundle]pathForResource: @”XML_stu” ofType: @”txt”];
//通过文件路径 创建一个NSData对象
NSData *data = [NSData dataWithContentsOfFile:path];
//SAX解析使用类
NSXMLParser *parser = [[NSXMLParser alloc]initWithData:data];
//指定代理
parser.delegate = self;
//开始解析
[parser parse];
}
//开始解析文档(只解析一次)
- (void)parserDidStartDocument:(NSXMLParser *)parser{
//初始化数据源数组
self.dataArray = [NSMutableArray array];
}
//检测到开始标签
- (void)parser:(NSXMLParser *)parser didStartElement:( NSString *)elementName namespaceURI:( NSString *)namespaceURI qualifiedName:( NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict
{
//给currentElement赋值
//如果标签的名字是student则表示要创建一个model,并添加到数据源数组里面
self.currentElement = elementName;
if([elementName isEqualToString: @”student”]){
Student *model = [Student new];
[self.dataArray addObject:model];
}
}
//检测到标签中的值
- (void)parser : (NSXMLParser *)parser foundCharacters:(NSString *)string{
//将检测的值存入model的具体属性
//知道给那个属性赋值,给那个model赋值,数组最后一个model赋值
Student *newmodel = [self.dataArray lastObject];
[newmodel setValue: string forKey : self.currentElement];
}
//检测到结束标签
- (void)parser: (NSXMLParser *)parser didEndElement: (NSString *)elementName namespaceURI: (NSString *)namespaceURI qualifiedName: (NSString *)qName{
self.currentElement = nil;
}
//结束解析文档
- (void)parserDidEndDocument : (NSXMLParser *)parser{
for(Student *stu in self.dataArray){
NSLog(@"%@, %@, %@, %ld",stu.name, stu.gender, stu.hobby, stu.age);
}
}
//GDataXMLDocument XML的DOM解析使用类
//首先也是创建路径,通过路径获取数据
GDataXMLDocument *document = [[GDataXMLDocument alloc]initWithData : data options:0 error:&error];
//第一个参数:解析Data对象
//第二个参数:一般为0
//第三个参数:error信息
//获取XML数据根节点
//获取到根节点里面所有的东西,也就是说获取到students里边包含的所有东西
GDataXMLDocument *rootElement = [document rootElement];
for (GDataXMLElement *subElement in rootElement.children){
//获取到的subElement保存的就是student标签里边的内容,所以这里创建对象
Student *student = [Student new];
for(GDataXMLElement *element in subElement.children){
//element 保存的就是student标签的所有子标签
//根据标签的名字给属性赋值
if([element.name isEqualToString:@”name”]){
//element.name 表示标签名字
//element.stringValue 表示标签值
student.name = element.stringValue;
}
if ([element.name isEqualToString:@”gender”]){
student.gender = element.stringValue;
}
if([element.hobby isEqualToString:@”hobby”])
student.hobby = element.stringValue;
}
if ([element.name isEqualToString:@”age”]){
student.age = [element.stringValue integerValue];
}
}
[self.dataArray addobject:student];
}
for(Student *stu in self.dataArray){
NSLog(@”%@ %@ %@ %ld”,stu.name, stu.gender, stu.hobby, stu.age);
}
JSON解析
//第一种:
//创建路径,通过路径获取数据
NSString *path = [[NSBundle mainBundle]pathForResource:@”JSON_stu” ofType :@”txt”];
NSData *data = [NSData dataWithContentOfFile:path];
NSArray *array = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
For(NSDictionary *dic in array){
NSLog(@”%@”, [dic objectForKey:@”content”]);
}
/*
NSJSONReadingMutableContainers //返回一个数组或字典
NSJSONReadingMutableLeaves //返回一个字符串
NSJSONReadingAllowFragments //返回一个任意类型的对象
*/
//第二种
touchesBegan方法里写
NSString *path = [[NSBundle mainBundle]pathForResource: @"JSON_stu" ofType:@"txt"];
NSData *data = [NSData dataWithContentsOfFile:path];
//将JSON数据转化为需要的数据格式
NSArray *array = [data objectFromJSONData];