解析:按照一种约定的格式,由后台开发人员按照此格式存储数据,由前台开发人员按照此 格式读取数据.
解析的本质:按照一定的格式,取出我们想要的数据的过程
目前比较流行的格式:XML格式 和 JSON格式
XML解析两种解析的原理
SAX解析:是一种基于事件回调的解析机制,就是使用协议以及代理,SAX解析是逐行解析,读入数据时只读一行 是一行一行的解析,所以SAX解析所占的内存小,适合大数据解析.
DOM解析:一次性将内容全部读入内存,将内容读成树形结构,逐层解析,适合小的数据解析.
1.SAX解析的详细步骤
(1)获取文件路径
NSString *xmlPath = [[NSBundle mainBundle] pathForResource:@"Person" ofType:@"xml"];
(2)根据文件路径初始化NSData对象
NSData *data = [NSData dataWithContentsOfFile:xmlPath];
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
(4)设置代理
parser.delegate = self;
(5)开始解析
[parser parse];
由上面可以知道设置了代理必须服从协议 ( NSXMLParserDelegate)那么接下来就是实现协议里面以下的方法.
//当读取到开始标签时触发
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
//当数据存储到开始标签的属性中时,处理方式
if ([elementName isEqualToString:@"persons"]) {
//为数据开辟空间
self.arr = [NSMutableArray array];
}else if ([elementName isEqualToString:@"person"]){
//为Person开辟空间
self.per =[[[Person alloc] init] autorelease];
[self.arr addObject:self.per];
}else if ([elementName isEqualToString:@"name"]){
self.per.name = attributeDict[@"name"];
}else if ([elementName isEqualToString:@"gender"]){
self.per.gender = attributeDict[@"gender"];
}else if ([elementName isEqualToString:@"age"]){
self.per.age = attributeDict[@"age"];
}else if ([elementName isEqualToString:@"phoneNumber"]){
self.per.phoneNumber = attributeDict[@"phoneNumber"];
}else if ([elementName isEqualToString:@"imageName"]){
self.per.imageName = attributeDict[@"iamgeName"];
}
//当数据存储在开始标签和结束标签之间时
// if ([elementName isEqualToString:@"persons"]) {
// //维数组开辟空间
// self.arr = [NSMutableArray array];
// }else if ([elementName isEqualToString:@"person"]){
// //为Person对象开辟空间
// self.per = [[[Person alloc] init] autorelease];
// }
}
//当读到标签后的内容时触发
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
self.str = string;//保存读取到的数据
}
//当读取到结束标签时触发
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
// if ([elementName isEqualToString:@"name"]) {
// self.per.name = self.str;
// }else if ([elementName isEqualToString:@"gender"]){
// self.per.gender =self.str;
// }else if ([elementName isEqualToString:@"age"]){
// self.per.age = self.str;
// }else if ([elementName isEqualToString:@"imageName"]){
// self.per.imageName = self.str;
// }else if ([elementName isEqualToString:@"phoneNumber"]){
// self.per.phoneNumber = self.str;
// }else if ([elementName isEqualToString:@"person"]){
// //当读到person结束标签时,person对象已经读取完毕,存储到数组中
// [self.arr addObject:self.per];
// }
// NSLog(@"end %@",elementName);
}
//当解析完毕之后触发
- (void)parserDidEndDocument:(NSXMLParser *)parser
{
NSLog(@"%@",self.arr);
}