通常数据解析有两种方式,一种是XML解析,另一种是Json解析,这两种解析方式是我们经常用到并且也是很使用的解析方式,当然既然有相同的特点也会有各自不同的优缺点,下面就让我们仔细的分析一下这两种解析方法吧!
首先让我们先分析一下SAX解析方法,SAX是一种XML的替代方法。相比于DOM,SAX是一种更快捷更有效的方法,它会对文档逐行扫描从而可以在解析文档时能够任意停止,但是它的过程是比较复杂的.下面让我们看一看关于它解析过程的代码.
1.在我们开始解析之前要获取文档的路径,然后去创建一个协议因为在这里使用协议传值.
NSString *str = [[NSBundle mainBundle]pathForResource:@"Student" ofType:@"xml"];
NSData *datt =[NSData dataWithContentsOfFile:str];
NSString * stt = [[NSString alloc]initWithData:datt encoding:NSUTF8StringEncoding];
NSLog(@"%@",stt);
NSXMLParser * parser = [[NSXMLParser alloc]initWithData:datt];
parser.delegate = self;
//开始解析
[parser parse];
2.在这里我创建一个model,然后将每一个student添加到一个model中,再将每一个model添加到一个大数组中.
static NSString *KStudents = @"students"; static NSString *KStudent = @"student"; static NSString *KNumber = @"number"; static NSString *KPhone = @"phone"; static NSString *KName = @"name"; //开始解析 - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{ NSLog( @"parser ==%@ ele=====%@ name====%@ qName====%@ attribut=====%@",parser,elementName,namespaceURI,qName,attributeDict); if ([elementName isEqualToString:KStudent]) { SaxModel *model = [[SaxModel alloc]init]; [_arr addObject:model]; [model release]; } }
3.接下来就是我们解析过程中最重要的环节了,从解析出来的数据中取出每一个student里面的属性值
//结束解析
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
NSLog( @"parser ??==%@ ele??=====%@ name??====%@ qName??====%@ ",parser,elementName,namespaceURI,qName);
SaxModel *model = [_arr lastObject];
if ([elementName isEqualToString:KNumber]) {
model.number = _nss;
}
if ([elementName isEqualToString:KName]) {
model.name = _nss;
}
if ([elementName isEqualToString:KPhone]) {
model.phone = _nss;
}
if ([elementName isEqualToString:KStudents]) {
[self.mydelegate sendMessage:_arr];
}
}
4.接下来就是查找内容
//查找内容
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
_nss = [string copy];
NSLog( @"parser ??++++++==%@ string??+++++++=====%@ ",parser,string);
}
同样我们还是以student为例.
下面请看代码演示.
在这里我同样创建一个model类,首先我们要获得根节点,然后获得节点中的内容.
-(void)domParserAttributes{
NSString *path = [[NSBundle mainBundle]pathForResource:@"citys" ofType:@"xml"];
NSData *data = [NSData dataWithContentsOfFile:path];
NSError *error = Nil;
GDataXMLDocument * document = [[GDataXMLDocument alloc]initWithData:data options:GDataXMLDocumentKind error:&error];
if (error) {
NSLog(@"erro!!!!!!!!====%@",error);
}
//获得根节点
GDataXMLElement *root = [document rootElement ];
NSLog(@"root!!!!!!!!!!!==%@",root);
GDataXMLElement *citys = [[root children] lastObject];
NSArray *city = [citys children];
for (GDataXMLElement *elenemt in city) {
NSArray *discripte = [elenemt children];
for (GDataXMLElement *value in discripte) {
DomModel * mo = [[DomModel alloc]init];
[_arr addObject:mo];
if ([[value name] isEqualToString:@"name" ])
{
[_arr lastObject];
GDataXMLNode *node = [value attributeForName:@"data"];
mo.name = [node stringValue];
}
if ([[value name]isEqualToString:@"longitude_e6"]) {
DomModel *mo = [_arr lastObject];
GDataXMLNode *node = [value attributeForName:@"data"];
mo.longitude_e6 = [node stringValue];
}
if ([[value name]isEqualToString:@"latitude_e6"]) {
DomModel *mo = [_arr lastObject];
GDataXMLNode *node = [value attributeForName:@"data"];
mo.latitude_e6 = [node stringValue];
}
}
}
}
DOM和SAX相比谁更简洁我想大家早就一目了然了,那么接下来让我们看看JSON是怎么样解析的吧!
同样第一步我们还是要获取路径,然后我们用字典获取里面的内容,最后将数据里面的所有KEY值添加到数组中.
-(void)JsonParser { NSString * path = [[NSBundle mainBundle]pathForResource:@"citys" ofType:@"txt"]; NSData * data = [NSData dataWithContentsOfFile:path]; NSError * error = Nil; NSDictionary * dic= [NSJSONSerialization JSONObjectWithData:data options:(NSJSONReadingMutableContainers) error:&error]; [_arr addObjectsFromArray:[dic objectForKey:@"cities"]]; }
以上就是我要分享的全部内容,本人才疏学浅如果以上知识点有不准确的地方忘请见谅! 希望您多关注本人的博客,以后还会有更多的知识点与大家分享,谢谢您的关注!