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

iOS XML,JOSN数据解析

2016-01-13 21:57 441 查看
解析:按照事先约好的格式提取数据的过程叫做解析
 后台开发人员按照约好的数据存
4000
入格式,前台按照约好的格式读取数据
iOS开发常⻅见的解析:XML解析、JSON解析 

XML解析:

主流格式:SAX, DOM(前台与后台都可以识别)
 XML解析的工作原理
 1.SAX:基于事件回调的解析机制,逐行进行解析,效率低,适合海量数据
 2.DOM:将解析的数据整体读入内存,初始化树形结构,逐行解析,效率高,适合于小量数据,谷歌提供了一个解析用的第三方,GDataXMLNode
//SAX解析
//1.找到.xml文件的路径
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"xml"];
//2.根据路径获取该路径下文件里的数据
NSData *data = [NSData dataWithContentsOfFile:filePath];
//3.进行SAX解析
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
//设置代理
parser.delegate = self;
//通知parser对象开始解析
[parser parse];
[parser release];
#pragma mark - NSXMLParserDelegate

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
//如果判断走到Student的开始标签时创建一个Student对象
if ([elementName isEqualToString:@"Student"]) {
self.student = [[Student alloc] init];
self.student.position = attributeDict[@"position"];

}
//    NSLog(@"%@", attributeDict[@"position"]);
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
self.value = string;
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
if ([elementName isEqualToString:@"name"]) {
self.student.name = self.value;
}else if ([elementName isEqualToString:@"gender"]){
self.student.gender = self.value;
}else if ([elementName isEqualToString:@"motto"]){
self.student.motto = self.value;
}else if ([elementName isEqualToString:@"Student"]){
[self.dataSource addObject:self.student];
}

}

- (void)parserDidEndDocument:(NSXMLParser *)parser{
[self.tableView reloadData];
}

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return self.dataSource.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];

// Configure the cell...
Student *stu = self.dataSource[indexPath.row];
cell.textLabel.text = [NSString stringWithFormat:@"%@ %@ %@ %@", stu.name, stu.gender, stu.motto, stu.position];
return cell;
}
//DOM解析(两种方式1.从上往下找(从根节点往下寻找)2.直接找)
<span style="font-size:18px;">[self.dataSources removeAllObjects];
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"xml"];
//对象是error的时候要传取值符
NSError *error = nil;
NSString *string = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:&error];
//1.将数据整体存入内存
GDataXMLDocument *document = [[[GDataXMLDocument alloc] initWithXMLString:string options:0 error:nil] autorelease];
//2.找到根节点
GDataXMLElement *rootElement = [document rootElement];
//3.找student节点
NSArray *studentElement = [rootElement elementsForName:@"Student"];
//遍历获取到对应的叶子节点
for (GDataXMLElement *obj in studentElement) {
GDataXMLElement *nameElement = [[obj elementsForName:@"name"] firstObject];
GDataXMLElement *genderElement =  [[obj elementsForName:@"gender"] firstObject];
GDataXMLElement *mottoElement = [[obj elementsForName:@"motto"] firstObject];
Student *student = [[[Student alloc] init] autorelease];
//将叶子节点中的值赋给对应的对象
student.name = [nameElement stringValue];
student.gender = [genderElement stringValue];
student.motto = [mottoElement stringValue];
//获取节点中的标签值(属性值)
GDataXMLNode *node = [obj attributeForName:@"position"];
student.position = [node stringValue];
[self.dataSources addObject:student];
}
[self.tableView reloadData];
</span>
2.DOM直接找
<span style="font-size:18px;">[self.dataSources removeAllObjects];
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"xml"];
//对象是error的时候要传取值符
NSError *error = nil;
NSString *string = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:&error];
//1.将数据整体存入内存
GDataXMLDocument *document = [[[GDataXMLDocument alloc] initWithXMLString:string options:0 error:nil] autorelease];
//2.直接通过相对路径找到叶子节点
NSArray *stus = [document nodesForXPath:@"//Student" error:nil];
NSArray *names = [document nodesForXPath:@"//name" error:nil];
NSArray *genders = [document nodesForXPath:@"//gender" error:nil];
NSArray *mottos = [document nodesForXPath:@"//motto" error:nil];
//   NSArray *positions = [document nodesForXPath:@"//Student" error:nil];

for (int i = 0; i < 3; i++) {
//创建对象
Student *stu = [[Student alloc] init];
//取出对应的叶子节点
GDataXMLElement *name = names[i];
GDataXMLElement *gender = genders[i];
GDataXMLElement *motto = mottos[i];
//     GDataXMLElement *position = positions[i];
GDataXMLElement *stuElement = stus[i];
//给对象对应的属性赋值
stu.name = [name stringValue];
stu.gender = [gender stringValue];
stu.motto = [motto stringValue];
GDataXMLNode *node = [stuElement attributeForName:@"position"];
stu.position = [node stringValue];
//将对象放入数组
[self.dataSources addObject:stu];
[stu release];
}
[self.tableView reloadData];
}
</span>


JSON解析(简单,也是最常用的)
<span style="font-size:18px;">//1.找到.json文件的路径
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"json"];
//2.根据路径获取该路径下文件里的数据
NSData *data = [NSData dataWithContentsOfFile:filePath];
//3.解析
NSError *error = nil;
NSMutableArray *arr = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];
//    NSLog(@"%@", arr);
for (NSDictionary *dic in arr) {
Student *stu = [[Student alloc] initWithDictionary:dic];
[self.dataSourse addObject:stu];
}
[self.tableView reloadData];
</span>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ios XML JSON 数据解析 SAX