#import "GDataXMLNode.h"//引第三方頭文件
#import "JSONKit.h"//引第三方頭文件
@interface RootViewController : UIViewController<NSXMLParserDelegate>//協議
@property(nonatomic,retain)NSMutableArray *allStudentArray;
@property(nonatomic,copy)NSString *currentElement;//記錄當前的標籤
xml解析數據有兩種方法:
1.SAX解析
2.DOM解析
SAX解析
特點:對xml格式數據進行逐步解析,就是從上到下,一行一行解析
優點:不會將xml數據讀取到內存上,不佔內存,適合解析大型數據
缺點:效率低,不能讀取指定位置的數據,只能從上到下逐行解析
-(void)xmlbuttonAction:(UIButton *)btn
{
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Students" ofType:@"txt"];
NSData *data = [NSData dataWithContentsOfFile:filePath];
//系統提供SAX解析類
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
parser.delegate = self;
//開始解析
[parser parse];
}
//解析開始
-(void)parserDidStartDocument:(NSXMLParser *)parser
{
NSLog(@"解析開始");
self.allStudentArray = [NSMutableArray array];
}
//解析開始標籤名
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
NSLog(@"開始標籤名 = %@", elementName);
if ([elementName isEqualToString:@"stu"])
{
//一個stu開始標籤對應一個學生對象
Student *stu = [[Student alloc] init];
[self.allStudentArray addObject:stu];
[stu release];
}
//始終記錄着當前標籤名
self.currentElement = elementName;
}
//解析標籤值
-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
//取出數組最後一個對象,也就是新加入的對象
Student *stu = [self.allStudentArray lastObject];
// if (self.currentElement isEqualToString:@:"number")
// {
// stu.number = string;
// }
// if (self.currentElement isEqualToString:@:"name")
// {
// stu.name = string;
// }
// if (self.currentElement isEqualToString:@:"address")
// {
// stu.address = string;
// }
// if (self.currentElement isEqualToString:@:"time")
// {
// stu.time = string;
// }
//KVC
[stu setValue:string forKey:self.currentElement];
//NSLog(@"值 = %@", string);
}
//解析結束標籤名
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
NSLog(@"結束標籤名 = %@", elementName);
//防止覆蓋
self.currentElement = nil;
for (Student *stu in self.allStudentArray)
{
NSLog(@"%@ %@ %@", stu.name, stu.number, stu.address);
}
}
//解析結束
-(void)parserDidEndDocument:(NSXMLParser *)parser
{
NSLog(@"解析結束");
}
DOM解析 是谷歌公司08年提供的一個xml解析工具
特點:將整個xml文件數據以樹形結構的形式儲存到內存上,然後進行讀取
優點:效率快,可以讀取指定位置的數據
缺點:耗內存,不適合讀取大型數據
-(void)dombuttonAction:(UIButton *)btn
{
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Students" ofType:@"txt"];
NSData *data = [NSData dataWithContentsOfFile:filePath];
//創建dom解析對象
//參數1.data類型的數據
//參數2.蘋果備用信息(無用)
//參數3.錯誤信息
NSError *error = nil;//初始化錯誤對象
//1.將數據以樹形結構讀取到內存上
GDataXMLDocument *xmlDocument = [[GDataXMLDocument alloc] initWithData:data options:0 error:&error];
NSLog(@"error = %@", error);
//2.得到根節點
GDataXMLElement *rootElement = xmlDocument.rootElement;
NSLog(@"====%@", rootElement);
self.allStudentArray = [NSMutableArray array];
//3.遍歷找到根節點<student>上的所有子節點
for (GDataXMLElement *subElement in rootElement.children)
{
Student *stu = [[Student alloc] init];
//4.遍歷節點<stu>上的子節點<name>,<number>,<address>等
for (GDataXMLElement *element in subElement.children)
{
NSLog(@"value = %@, name = %@", element.stringValue, element.name);
[stu setValue:element.stringValue forKey:element.name];
}
[self.allStudentArray addObject:stu];
[stu release];
}
for (Student *stu in self.allStudentArray)
{
NSLog(@"name = %@ number = %@ address = %@", stu.name, stu.number, stu.address);
}
}
//JSONKit
-(void)jsonbuttonAction:(UIButton *)btn
{
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Teachers" ofType:@"txt"];
NSData *data = [NSData dataWithContentsOfFile:filePath];
//使用JSONKit進行數據解析
NSMutableArray *array = [data objectFromJSONData];
NSLog(@"array = %@", array);
//使用系統類解析json數據
NSMutableArray *array2 = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
NSLog(@"array2 = %@", array2);
}
針對數據解析,不管是xml還是json,最終目的就是將網絡或者本地文件中的數據取出來,存入到model屬性中,並存入數組.modol屬性名字根據key來決定
xml解析數據
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.