解析的XML文件json
StudentInformation_XML.txt數組
1 <students> 2 <student> 3 <name>小暖心</name> 4 <gender>女</gender> 5 <age>18</age> 6 <hobby>傲然</hobby> 7 </student> 8 <student> 9 <name>MBBoy</name> 10 <gender>男</gender> 11 <age>20</age> 12 <hobby>借牙籤</hobby> 13 </student> 14 <student> 15 <name>海</name> 16 <gender>男</gender> 17 <age>16</age> 18 <hobby>助人爲樂</hobby> 19 </student> 20 <student> 21 <name>-1</name> 22 <gender>男</gender> 23 <age>69</age> 24 <hobby>芳芳女神</hobby> 25 </student> 26 <student> 27 <name>yyp</name> 28 <gender>女</gender> 29 <age>18</age> 30 <hobby>學習</hobby> 31 </student> 32 </students>
SAX:Simple API for XML 。 基於事件驅動的解析方式,逐行解析數據(採用協議回調機制)xcode
使用NSXMLParse要先建立它,設置各類屬性,主要用到一下幾個方法:
瀏覽器
SAM解析XML數據步驟服務器
1 #pragma mark - sax解析XML文件 2 - (IBAction)saxParserActionXMLDocument:(UIButton *)sender { 3 // 1.獲取文件路徑 4 NSString *filePath = [[NSBundle mainBundle] pathForResource:@"StudentInformation_XML" ofType:@"txt"]; 5 // 2.將文件轉換成NSData類型的對象 6 NSData *data = [NSData dataWithContentsOfFile:filePath]; 7 // NSLog(@"%@",data); 8 // 3.設置SAX解析,並關聯相關的XML文件 9 NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data]; 10 // 4.設置代理 11 parser.delegate = self; 12 // 5.開始解析 13 [parser parse]; 14 } 15 16 #pragma mark - NSXMLParserDelegate的協議方法 17 #pragma mark - 1.文檔解析 18 - (void)parserDidStartDocument:(NSXMLParser *)parser { 19 // 數組初始化 20 self.dataArray = [NSMutableArray array]; 21 } 22 23 #pragma mark - 2.開始標籤解析 24 - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict { 25 // 根據需求須要的標籤去獲取相關的數據 26 if ([elementName isEqualToString:@"student"]) { 27 Student *student = [[Student alloc] init]; 28 // 在這裏不須要賦值 29 // 將數據對象添加到數組中 30 [self.dataArray addObject:student]; 31 } 32 // 將當前的標籤值傳給currentElement屬性 33 self.currentElement = elementName; 34 } 35 36 #pragma mark - 3.解析標籤中的內容,給對象賦值 37 - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 38 // 從數組中取出相關的student對象,每次從數組中去最後一個元素,保證每次取出的對象都是剛剛存入的對象 39 Student *student = [self.dataArray lastObject]; 40 // KVC賦值 41 [student setValue:string forKey:self.currentElement]; 42 } 43 44 #pragma mark - 4.結束標籤 45 - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { 46 self.currentElement = nil; 47 } 48 49 #pragma mark - 5.結束文檔解析 50 - (void)parserDidEndDocument:(NSXMLParser *)parser { 51 // 打印校驗 52 for (Student *student in self.dataArray) { 53 NSLog(@"name = %@, gender = %@, age = %ld, hobby = %@", student.name, student.gender, student.age, student.hobby); 54 } 55 } 56 57 #pragma mark - 6.查看相關的錯誤處理 58 - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError { 59 NSLog(@"錯誤信息error = %@", parseError); 60 }
DOM:Document Object Model(文檔對象模型)。DOM方式解析XML時,讀入整個XML文檔並構建一個駐留內存的樹結構(節點樹),經過遍歷樹結構能夠檢索任意XML節點,讀取它的屬性和值。並且一般狀況下,能夠藉助XPath,直接查詢XML節點。數據結構
GDataXMLElement類的用到的屬性和方法
框架
GDataXMLNote解析XML文件步驟dom
1 #pragma mark - --------------------------------------------- 2 #pragma mark - DOM解析XML文件 3 - (IBAction)domParserActionXMLDocument:(UIButton *)sender { 4 // 1.引入libxml2.tbd動態庫 5 // 2.引入第三方GDataXMLNode 6 // 3.獲取文件路徑 7 NSString *filePath = [[NSBundle mainBundle] pathForResource:@"StudentInformation_XML" ofType:@"txt"]; 8 // 4.根據路徑獲取NSData類型的數據 9 NSData *data = [NSData dataWithContentsOfFile:filePath]; 10 // 4.5 初始化數組 11 self.dataArray = [NSMutableArray array]; 12 // 5.設置DOM解析,建立GDataXMLDocument對象,此時XML文件內全部的節點以樹的形式存在GDataXMLDocument 13 GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil]; 14 // 6.獲取根節點,根節點裏麪包含了XML的全部信息 15 GDataXMLElement *rootElement = document.rootElement; 16 // 7.遍歷獲取相對應的子節點(student) 17 for (GDataXMLElement *studentElement in rootElement.children) { 18 Student *student = [[Student alloc] init]; 19 // 遍歷子節點(student)的子節點(name,gender,age,hobby) 20 for (GDataXMLElement *element in studentElement.children) { 21 NSLog(@"%@",element); 22 // KVC:根據標籤給student對象賦值 23 // element.name 標籤的名字 24 // element.stringValue 標籤的值 25 [student setValue:element.stringValue forKey:element.name]; 26 } 27 // 將student對象添加到數組中 28 [self.dataArray addObject:student]; 29 } 30 // 遍歷檢驗 31 for (Student *student in self.dataArray) { 32 NSLog(@"name = %@, gender = %@, age = %ld, hobby = %@", student.name, student.gender, student.age, student.hobby); 33 } 34 }
解析的JSON文件 工具
StudentInformation_json.txt學習
1 [ 2 { 3 "name":"凱凱", 4 "gender":"男", 5 "age":"18", 6 "hobby":"PS" 7 }, 8 { 9 "name":"YH", 10 "gender":"男", 11 "age":"20", 12 "hobby":"女" 13 }, 14 { 15 "name":"ZF", 16 "gender":"男", 17 "age":"20", 18 "hobby":"玩毛" 19 }, 20 { 21 "name":"小明", 22 "gender":"男", 23 "age":"22", 24 "hobby":"滾出去" 25 }, 26 { 27 "name":"淮予", 28 "gender":"女", 29 "age":"21", 30 "hobby":"小暖心" 31 } 32 ]
NSJSONSerialization 裏面包含了兩個方法來經過不一樣數據形式解析JSON數據。
1 #pragma mark - --------------------------------------------------- 2 #pragma mark - 系統自帶Foundation框架解析JSON數據 3 - (IBAction)foundationParserActionJSONDocument:(UIButton *)sender { 4 // 1.獲取文件路徑 5 NSString *filePath = [[NSBundle mainBundle] pathForResource:@"StudentInformation_json" ofType:@"txt"]; 6 // 2.根據路徑獲取NSData類型的數據 7 NSData *data = [NSData dataWithContentsOfFile:filePath]; 8 // 2.5 初始化數組 9 self.dataArray = [NSMutableArray array]; 10 // 3.解析 11 NSArray *resultArray = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil]; 12 // 4.遍歷數組,使用KVC給Student對象賦值 13 for (NSDictionary *dict in resultArray) { 14 Student *student = [[Student alloc] init]; 15 [student setValuesForKeysWithDictionary:dict]; 16 [self.dataArray addObject:student]; 17 } 18 // 遍歷檢驗 19 for (Student *student in self.dataArray) { 20 NSLog(@"name = %@, gender = %@, age = %ld, hobby = %@", student.name, student.gender, student.age, student.hobby); 21 } 22 }
引入JSONKit.h/m文件,並設置非ARC文件在ARC環境下運行。
1 1 #pragma mark - ------------------------------------------------- 2 2 #pragma mark - 使用第三方類JSONKit來解析JSON數據 3 3 - (IBAction)jsonkitParserActionJSONDocument:(UIButton *)sender { 4 4 // 1.引入第三方類 -- 設置 非arc文件在arc環境下運行 5 5 // 2.獲取文件路徑 6 6 NSString *filePath = [[NSBundle mainBundle] pathForResource:@"StudentInformation_json" ofType:@"txt"]; 7 7 // 3.根據路徑獲取NSData類型的數據 8 8 NSData *data = [NSData dataWithContentsOfFile:filePath]; 9 9 // 3.5初始化數組 10 10 self.dataArray = [NSMutableArray array]; 11 11 // 4. 解析 與NSJSONSerialization解析的惟一差異 12 12 NSArray *resultArray = [data objectFromJSONData]; 13 13 // 5.遍歷數組,使用KVC給Student對象賦值 14 14 for (NSDictionary *dict in resultArray) { 15 15 Student *student = [[Student alloc] init]; 16 16 [student setValuesForKeysWithDictionary:dict]; 17 17 [self.dataArray addObject:student]; 18 18 } 19 19 // 遍歷檢驗 20 20 for (Student *student in self.dataArray) { 21 21 NSLog(@"name = %@, gender = %@, age = %ld, hobby = %@", student.name, student.gender, student.age, student.hobby); 22 22 } 23 23 }
1.數據解析:從某種格式的數據中提取本身所須要的數據 2.主流的數據交換格式有兩種:XML和JSON 3.XML解析分爲兩種:SAX解析和DOM解析 4.XML解析工具:NSXMLParser、GDataXMLNode、TochXML和KissXML等 5.JSON解析工具:JSONKit、NSJSONSerialization、TouchJSON和SBJSON等,其中NSJSONSerialization是系統提供的解析類,其解析效率是最高的