对于数据的解析方式有两种: XML 和 JSON 解析
下面来给大家简单介绍一下这两种解析方式 , 希望能帮到您!
XML解析方式
//这个系统的解析方式
- (IBAction)xmlParserWithSAX:(UIButton *)sender {
//SAX解析的方式: 逐行解析, 效率比较低, 资源消耗比较小, 如果xml格式有误, 错误之前的可以解析
//NSXMLParser, xml解析类(SAX), 继承于NSObject
//文件路径
NSString *fielPath = [[NSBundle mainBundle] pathForResource:@"Girl" ofType:@"xml"];
//url
NSURL *url = [NSURL fileURLWithPath:fielPath];
//根据文件路径创建解析类
NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:url];
//整个解析过程, 可以再代理方法中查看
parser.delegate = self;
//开始解析
[parser parse];
//释放
[parser release];
}
解析过程需要在其代理方法中查看
#pragma mark - NSXMLParserDelegate
//已经开始解析文件
- (void)parserDidStartDocument:(NSXMLParser *)parser {
NSLog(@"文件已经开始解析");
//对数组初始化
self.girlArray = [NSMutableArray arrayWithCapacity:3];
}
//文件已经结束解析
- (void)parserDidEndDocument:(NSXMLParser *)parser {
NSLog(@"文件已经结束解析");
for (Girl *girl in self.girlArray) {
NSLog(@"%@", girl);
}
}
//遇到开始标签
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
NSLog(@"遇到开始标签:%@", elementName);
//遇到开始标签girl时创建girl
if ([elementName isEqualToString:@"girl"]) {
self.girl = [[Girl alloc] init];
}
}
//遇到结束标签
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
NSLog(@"遇到结束标签:%@", elementName);
if ([elementName isEqualToString:@"name"]) {
self.girl.name = self.tempString;
}else if ([elementName isEqualToString:@"age"]){
self.girl.age = self.tempString;
}else if ([elementName isEqualToString:@"height"]) {
self.girl.height = self.tempString;
}else if ([elementName isEqualToString:@"girl"]){
[self.girlArray addObject:self.girl];
[self.girl release];
}
}
//发现字符串
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
NSLog(@"发现字符串:%@", string);
self.tempString = string;
}
//解析出现错误
- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError {
NSLog(@"解析出现错误:%@", parseError);
}
针对XML还有一些第三方的解析方式
//DOM解析法
//注: 使用第三方类库, 一定要引入头文件, 才能使用, 需要该配置环境的要改一下
//如: #import “GDataXMLNode.h”
- (IBAction)xmlParserWithDOM:(UIButton *)sender {
//DOM解析方式: 正整片读完, 再解析, 效率比较高, 资源消耗比较大, 如果xml有误, 就无法解析
//谷歌提供的DOM解析类, GDataXMLNode
//第三方类库的使用
//1. 下载第三方类, code4app, github
//2. 导入工程
//3. 配置环境(可选的)
// a. 当前工程是ARC, 第三方类库是MRC, 需要单独配置第三方类库的环境, flag写成 - fno-objc-arc
// b. 当前工程是MRC, 第三方类库是ARC, 需要单独配置第三方类库的环境, flag写成 - fobjc-arc
//4. 导入第三方使用的类库(可选的)
// 比如GDataXMLNode需要导入libxml
//5. 配置参数(可选的)
//6. 引入头文件
//文件路径
NSString *fielPath = [[NSBundle mainBundle] pathForResource:@"Girl" ofType:@"xml"];
//获取文件内容
NSString *content = [[NSString alloc] initWithContentsOfFile:fielPath encoding:NSUTF8StringEncoding error:nil];
//解析, 分析出xml文档的结构
GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithXMLString:content options:0 error:nil];
//获取根节点 girls
GDataXMLElement *rootElement = [document rootElement];
NSLog(@"%@", rootElement);
//查找girls节点下的子节点girl
NSArray *girlElements = [rootElement elementsForName:@"girl"];
//对节点数组进行遍历
self.girlArray = [NSMutableArray arrayWithCapacity:3];
for (GDataXMLElement *element in girlElements) {
// NSArray *nameElement = [element elementsForName:@"name"];
// GDataXMLElement *name = [nameElement firstObject];
// NSLog(@"%@", [name stringValue]);
NSString *name = [[[element elementsForName:@"name"] firstObject] stringValue];
NSString *age = [[[element elementsForName:@"age"] firstObject] stringValue];
NSString *height = [[[element elementsForName:@"height"] firstObject] stringValue];
//NSLog(@"%@ %@ %@", name, age, height);
Girl *girl = [[Girl alloc] init];
girl.name = name;
girl.age = age;
girl.height = height;
[self.girlArray addObject:girl];
[girl release];
}
for (Girl *girl in self.girlArray) {
NSLog(@"%@", girl);
}
//GDataXMLNode是支持XPath的
//XPath: 路径检索
// /代表绝对路径, //代表相对路径
NSArray *elements = [rootElement nodesForXPath:@"girl/name" error:nil];
for (GDataXMLElement *element in elements) {
NSLog(@"%@", [element stringValue]);
}
}
//下面来说一下JSON解析
//系统JSON的解析方法
- (IBAction)JSONparserWithSyetem:(UIButton *)sender {
// NSJSONSerialization, json解析类, 继承与NSObject
//文件路径
NSString *fielPath = [[NSBundle mainBundle] pathForResource:@"Boy" ofType:@"json"];
//从指定文件获取二进制数据
NSData *data = [[NSData alloc] initWithContentsOfFile:fielPath];
NSArray *array = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
//NSLog(@"%@", array);
NSMutableArray *boyArray = [NSMutableArray arrayWithCapacity:0];
for (NSDictionary *dic in array) {
//1.
// Boy *boy = [[Boy alloc] init];
// boy.name = dic[@"name"];
// boy.age = dic[@"age"];
// boy.height = dic[@"height"];
// [boyArray addObject:boy];
// [boy release];
//2.KVC赋值
// Boy *boy = [[Boy alloc] init];
// [boy setValuesForKeysWithDictionary:dic];
// [boyArray addObject:boy];
// [boy release];
//
Boy *boy = [[Boy alloc] initWithDictionary:dic];
[boyArray addObject:boy];
[boy release];
}
for (Boy *boy in boyArray) {
NSLog(@"%@", boy);
}
}
第三方的JSON解析方法
//注: 使用第三方类库, 一定要引入头文件, 才能使用, 需要该配置环境的要改一下
//如: #import “JSONKit.h”
- (IBAction)jsonparserWithThirdPart:(UIButton *)sender {
//JOSNKit
//1.
//从指定文件获取字符串
NSString *fielPath = [[NSBundle mainBundle] pathForResource:@"Boy" ofType:@"json"];
//从指定文件获取内容
NSString *content = [[NSString alloc] initWithContentsOfFile:fielPath encoding:NSUTF8StringEncoding error:nil];
//使用JOSNKit解析json字符串
NSArray *array = [content objectFromJSONString];
//NSLog(@"%@", array);
for (NSDictionary *dic in array) {
Boy *boy = [[Boy alloc] initWithDictionary:dic];
NSLog(@"%@", boy);
}
[content release];
//2
//从指定文件获取二进制数据
NSData *data = [[NSData alloc] initWithContentsOfFile:fielPath];
NSLog(@"---------第二种解析方法----------");
//使用JSONKit解析json二进制数据
NSArray *array1 = [data objectFromJSONData];
for (NSDictionary *dic in array1) {
Boy *boy = [[Boy alloc] initWithDictionary:dic];
NSLog(@"%@", boy);
}
[data release];
}