標籤:ios 解析檔案 json dom sax
主要是對檔案的三種解析方法,相關的檔案已經壓縮附件中
.h檔案
#import <UIKit/UIKit.h>
#import "StudentModel.h"
#import "GDataXMLNode.h"
@interface RootViewController : UIViewController<NSXMLParserDelegate>
@property(nonatomic,retain)NSMutableArray *dataArray;
//存放臨時變數
@property(nonatomic ,retain)NSString *tempStr;
@end
.m檔案
#import "RootViewController.h"
@interface RootViewController ()
@end
@implementation RootViewController
- (void)viewDidLoad {
[super viewDidLoad];
UIButton *button1 =[UIButton buttonWithType:UIButtonTypeCustom];
[button1 setTitle:@"JSON" forState:UIControlStateNormal];
UIButton *button2 =[UIButton buttonWithType:UIButtonTypeCustom];
[button2 setTitle:@"DOM" forState:UIControlStateNormal];
UIButton *button3 =[UIButton buttonWithType:UIButtonTypeCustom];
[button3 setTitle:@"SAX" forState:UIControlStateNormal];
button1.frame =CGRectMake(10, 80, 50, 20);
button2.frame =CGRectMake(30,110, 50, 20);
button3.frame =CGRectMake( 80, 150, 50, 20);
button1.layer.borderWidth =1;
button1.layer.borderColor =[UIColor blackColor].CGColor;
button2.layer.borderWidth =1;
button2.layer.borderColor =[UIColor blackColor].CGColor;
button3.layer.borderWidth =1;
button3.layer.borderColor =[UIColor blackColor].CGColor;
[self.view addSubview:button1];
[self.view addSubview:button2];
[self.view addSubview:button3];
self.view.backgroundColor =[UIColor redColor];
[button1 addTarget:self action:@selector(change1) forControlEvents:UIControlEventTouchUpInside];
[button2 addTarget:self action:@selector(change2) forControlEvents:UIControlEventTouchUpInside];
[button3 addTarget:self action:@selector(change3) forControlEvents:UIControlEventTouchUpInside];
}
//解析json
-(void)change1
{
NSString *path=[[NSBundle mainBundle]pathForResource:@"Student" ofType:@"txt"];
//根據路徑將檔案轉換為nsJSON
NSData *data =[NSData dataWithContentsOfFile:path];
self.dataArray =[NSMutableArray array];
//建立錯誤資訊
NSError *error =nil;
//擷取數組(裡面裝的字典)
NSArray *array = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];
//遍曆數組
for (NSDictionary *dic in array) {
StudentModel *stu =[StudentModel getStudentModel];
[stu setValuesForKeysWithDictionary:dic];
[self.dataArray addObject:stu];
}
//結果列印查看
StudentModel *stu1 =[self.dataArray objectAtIndex:1];
NSLog(@"%@",stu1.name);
}
-(void)change2
{
//dom解析
// NSString *path =[[NSBundle mainBundle]pathForResource:@"Student" ofType:@"xml"];
// NSData *data =[NSData dataWithContentsOfFile:path];
// self.dataArray =[NSMutableArray array];
// //轉載資料(資料全部加入記憶體,因此說dom解析在解析大資料時比較消耗記憶體)
// //1.參數代表資料 2參數沒用 3參數是錯誤資訊
// NSError *error =nil;
// GDataXMLDocument *document =[[GDataXMLDocument alloc]initWithData:data options:0 error:&error];
// //擷取根節點
// GDataXMLElement *rootElement =[document rootElement];
// //擷取所有子節點
// NSArray *array =[rootElement elementsForName:@"student"];
//
// //遍曆
// for (GDataXMLElement *node in array) {
// StudentModel *stu =[StudentModel getStudentModel];
// stu.name = [[[node elementsForName:@"name"]lastObject]stringValue];
// stu.sex =[[[node elementsForName:@"sex"]lastObject]stringValue];
// stu.number =[[[[node elementsForName:@"number"]lastObject]stringValue]integerValue];
// stu.phone =[[[[node elementsForName:@"phone"]lastObject]stringValue]integerValue];
// [self.dataArray addObject:stu];
//
// }
// StudentModel *model =[self.dataArray objectAtIndex:1];
// NSLog(@"%@",model.name);
NSString *path =[[NSBundle mainBundle]pathForResource:@"Student" ofType:@"xml"];
NSData *data =[NSData dataWithContentsOfFile:path];
self.dataArray =[NSMutableArray array];
NSError *error =nil;
GDataXMLDocument *document =[[GDataXMLDocument alloc]initWithData:data options:0 error:&error];
GDataXMLElement *rootElement =[document rootElement];
NSArray *array =[rootElement elementsForName:@"student"];
for (GDataXMLElement *node in array) {
StudentModel *stu =[StudentModel getStudentModel];
stu.name =[[[node elementsForName:@"name"]lastObject]stringValue];
stu.sex =[[[node elementsForName:@"sex"]lastObject]stringValue];
stu.number =[[[[node elementsForName:@"number"]lastObject]stringValue] integerValue];
stu.phone = [[[[node
elementsForName:@"phone"]lastObject]stringValue]integerValue];
[self.dataArray addObject:stu];
}
StudentModel *model =[self.dataArray objectAtIndex: 1];
NSLog(@"%@",model.name);
}
-(void)change3
{
//用sax方式來解析XML檔案
//擷取要解析的檔案路徑
NSString *path =[[NSBundle mainBundle]pathForResource:@"Student" ofType:@"xml"];
//把這個檔案轉化為nsdata
NSData *data =[NSData dataWithContentsOfFile:path];
//建立解析類
NSXMLParser *parser =[[NSXMLParser alloc]initWithData:data];
//設定代理
parser.delegate =self;
//開始解析
[parser parse];
}
-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
//發現節點內容
//記錄節點內容
self.tempStr =string;
}
#pragma -mark SAX解析代理方法
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
//前端節點
if ([elementName isEqualToString:@"students"]) {
self.dataArray =[NSMutableArray array];
} else if ([elementName isEqualToString:@"student"]){
StudentModel *stu =[StudentModel getStudentModel];
[self.dataArray addObject:stu];
}
}
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
//發現尾節點
//取出stdentmodel
StudentModel *stu =[self.dataArray lastObject];
if ([elementName isEqualToString:@"number"]) {
stu.number =[self.tempStr integerValue];
} else if ([elementName isEqualToString:@"name"]){
stu.name =self.tempStr;
}else if ([elementName isEqualToString:@"sex"]){
stu.sex =self.tempStr;
}else if ([elementName isEqualToString:@"phone"]){
stu.phone =[self.tempStr integerValue];
}
}
//解析完成
-(void)parserDidEndDocument:(NSXMLParser *)parser{
NSLog(@"解析完成");
StudentModel *stu =[self.dataArray objectAtIndex:1];
NSLog(@"%@",stu.name);
}
@end
本文出自 “ios” 部落格,請務必保留此出處http://10136044.blog.51cto.com/10126044/1679371
iOS 對於檔案的解析 JSON DOM SAX