您的位置:首页 > 移动开发 > IOS开发

ios XML/Jason数据解析

2014-02-26 19:48 399 查看
Sax解析是一种占用内存较小的解析方式,sax解析是随着文件的读取过程一条一条解析,一旦解析过程中文件出现错误,错误前所有的解析过的是可以保存的。

Dom解析把dom全部文件读入到内存中,然后使用dom的api遍历所有数据,检索想要的数据,这种方式比较消耗内存,对于手机应用来说并不推荐,而且一旦文件中有错误,Dom解析是无法解析数据的。

相对于sax解析,Dom比较直观,简单。在xml文档比较小的情况下也可以考虑使用dom方式。

//开始解析
-(void)starParser
{
//获取路径
NSString * path = [[NSBundle mainBundle] pathForResource:@"citys" ofType:@"xml"];

NSData * data = [[NSData alloc] initWithContentsOfFile:path];

NSXMLParser * paster= [[NSXMLParser alloc] initWithData:data];
//     现在去写协议
paster.delegate = self;
//     设置代理

//    开始解析
[paster parse];

}
协议前先建一个Model,一个数组用来存放获取的内容

Sax解析一般用到下面两个协议:

//开始的协议
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
//    从字段kCity开始
if ([elementName isEqualToString:kCity])
{
//        model中添加数据
Model_sax * sax = [[Model_sax alloc] init];
//      创建一个大数组 接受model
[_array addObject:sax];
[sax release];

}
//    给model的属性赋值开始了

if ([elementName isEqualToString:kName]) {
Model_sax * sax = [_array lastObject];
sax.name  = [attributeDict objectForKey:@"data"];

}
if ([elementName isEqualToString:klatitude_e6]) {
Model_sax * sax = [_array lastObject];
sax.latitude_e6 = [attributeDict objectForKey:@"data"];

}
if ([elementName isEqualToString:@"longitude_e6"]) {
Model_sax * sax = [_array lastObject];
sax.longitude_e6 = [attributeDict objectForKey:@"data"];
}

}

//结束协议

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{

//    当字段是cities时候结束添加  把数组传给视图控制器( 代理传值吧)
if ( [elementName isEqualToString:kCities]) {
[self.mydelegate saxParserFinshWithArr:_array];
_secdArrblock(_array);
}

}
这样一次简单的xml 解析就完成了!

下面开始Dom解析的代码演示

-(void)DomPaeserAttributes
{
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(@"error===%@",error);
}

//    获得根节点
GDataXMLElement * element= [document rootElement];

GDataXMLElement * citys = [[element children] lastObject];
NSArray * cityarr = [citys children];
for (GDataXMLElement * elements in cityarr) {

Model_dom * dom = [[Model_dom alloc] init];
[_arr addObject:dom];

NSArray * descriptarr = [elements children];
for (GDataXMLElement * value in descriptarr) {
if ( [[value name]isEqualToString:@"name"]) {

//               获得节点中属性的 内容
GDataXMLNode *node = [value attributeForName:@"data"];

NSString * str = [node stringValue];
Model_dom * domvalue = [_arr lastObject];
domvalue.name = str;
}
if ( [[value name]isEqualToString:@"latitude_e6"]) {

//               获得节点中属性的 内容
GDataXMLNode *node = [value attributeForName:@"data"];

NSString * str = [node stringValue];
Model_dom * domvalue = [_arr lastObject];
domvalue.latitude_e6 = str;
}
if ( [[value name]isEqualToString:@"longitude_e6"]) {

//               获得节点中属性的 内容
GDataXMLNode *node = [value attributeForName:@"data"];

NSString * str = [node stringValue];
Model_dom * domvalue = [_arr lastObject];
domvalue.longitude_e6 = str;
}
}
}

}


 最后是Jason解析    看完上面的这个就很简单了

-(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];
if (error) {
NSLog(@"error jason ===%@",error);
}
NSLog(@"jason dic  ==%@",dic);
[_arr addObjectsFromArray:[dic objectForKey:@"cities"]];

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  xml jason dom 数据 parse