1.解析的基本概念
定义:从事先规定好的格式中提取数据
解析前提:提前约定好格式,数据提供方按照格式提供数据,数据获取方则按照格式获取数据
iOS开发常见的解析:XML解析,JSON解析
2.XML数据结构
XML:可扩展标记语言,主流数据格式之一,可以用来存储和传输数据。
功能:数据交换,内容管理,用作配置文件
语法:
1.声明
2.节点使用一对标签表示:起始和结束标签
3.根节点是起始节点,只有一个,节点可以嵌套
4.节点可以有值,存储在一对儿标签中
实例:
3.进行XML解析时使用到的SAX文件
SAX:Simple API for XML.基于事件驱动的解析方式,逐行解析数据(采用协调回调机制)
1.NSXMLParser是iOS自带的xml解析类,采用SAX方式解析数据
2.解析过程由NSXMLParserDelegate协议方法回调
3.解析过程:开始标签 ->取值 ->结束标签 ->取值
源代码:
系统SAX解析:(结果使用一个数组存储,里面包含每个字典)
//1.获取文件路径
NSString *filePath = [[NSBundle mainBundle] pathForResource@"Studentlnfor_xml" ofType:@"txt"];
//2.获取出NSData类型的数据
NSData *data = [NSData dataWithContentsOfFile:filePath];
NSLog(@"data = %@",data);
//3.设置SAX文件,并关联相关的xml文件
NSXMLParser *parser = [[NSXMLParser alloc]initWithData:data];
//4.设置代理
parser.delegate = self;
//5.开始解析
[parser parser];
#pragma mark - NSXMLParserDelegate协议方法
//1.开始文档解析
- (void)parserDidStartDocument:(NSXMLParser *)parser {
//在这个方法里初始化数组(也可以懒加载)
self.dataArray = [NSMutableArray array];
}
//2.开始解析标签
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *>*)attributeDict {
//根据需求需要的标签去获取相关的数据
if([elementName isEqualToString:@"student"]) {
Student *stu = [[Student alloc] init];
//在这里不需要赋值操作,将数据对象添加到数组中
[self.dataArray addObject:stu];
NSLog(@"%@",self.dataArray);
}
//将当前的标签值传给刚才声明的一个属性
self.currentElement = elementName;
}
#pragma mark - 3.解析标签中的内容然后赋值给对象
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
//从数组中取出相关的student对象,每次从数组中取出最后一个元素,保证每次取出最新的对象内容
Student *stu = [self.dataArray lastObject];
//kvc赋值
[stu setValue:string forKey:self.currentElement];
}
#pragma mark - 4.结束标签
- (void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
self.currentElement = nil;
}
#pragma mark - 5.结束文档解析
- (void)parserDidEndDoucument:(NSXMLParser *)parser {
//取出数组校验
for(Student *student in self.dataArray) {
NSLog(@"name = %@,gender = %@,age = %ld,hobby = %@",student.name,student.gender,student.age,student.hobby);
}
}
#pragma mark - 6.错误处理
- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError {
NSLog(@"出错了:error = %@",parseError);
}
//第二种方法:使用DOM解析
//使用第三方:GDataXMLNode(谷歌)
1.需要引入一个动态库(libxml2.tbd)
2.获取文件路径(同上)
3.获取data数据(同上)
//4.初始化存储数据的数组
self.dataArray = [NSMutableArray array];
//5.设置dom解析(创建解析文档)
GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil];
//6.获取根节点(文档为根节点)
GDataXMLElement *rootElement = document.rootElement;
//7.变量获取相对应的子节点(studens是子节点,文档才是父节点)
for(GDataXMLElement *studentElement in rootElement.children) {
Student *student = [[Student alloc]init];
for(GDataXMLElement *stuElement in studentElement.children) {
[stu setVslue:stuElement.stringValue forKey:stuElement];
}
[self.dataArray addObject:stu];
//循环显示
for(Student *student in self.dataArray) {
NSLog(@"name = %@,gender = %@,age = %ld,hobby = %@",student.name,student.gender,student.age,student.hobby);
}
}
3.使用DOM解析
(1)设置Build Settings 里的Header Search Paths 添加 /user/include/libxml2
设置Build Settings里的Other Linker Flags 添加-lxml2
(2)设置Build Phases 里的GDataXMLNode,添加 -fno-objc - arc