對於數據的解析方式有兩種: 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];
}