iOS xml 解析方法有兩種:SAX , DOM.
SAX 不用借助第三方,在解析過程中逐行解析.(NSXMLParser,需要實現代理),具體步驟:
1.獲取文件路徑.
2.創建 NSXMLParser 對象.
3.遵守協議,設置代理.
4.實現代理方法
1>- (void)parserDidStartDocument: ---- 開始解析
2>- (void)parserDidEndDocument: ----解析結束
3>- (void)parser:didStartElement:namespaceURI:qualifiedName:attributes: ----遇到開始標簽
4>- (void)parser:didEndElement:namespaceURI:qualifiedName: ----遇到結束標簽
5>- (void)parser: foundCharacters: -----遇到值
詳細代碼:
1 - (IBAction)xmlParserWithSAX:(id)sender { 2 3 //獲取文件路徑 4 NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"xml"]; 5 //轉換為url 6 NSURL *url = [[NSURL alloc]initFileURLWithPath:filePath]; 7 //創建 NSXMLParser 對象 8 NSXMLParser *parser = [[NSXMLParser alloc]initWithContentsOfURL:url]; 9 parser.delegate = self;10 //開始解析11 [parser parse];12 }
代理方法實現:
1 /** 2 * 開始解析 xml 3 */ 4 - (void)parserDidStartDocument:(NSXMLParser *)parser{ 5 NSLog(@"開始解析"); 6 self.studentArray = [[NSMutableArray alloc]init]; 7 } 8 9 10 /**11 * 結束解析 xml12 */13 - (void)parserDidEndDocument:(NSXMLParser *)parser{14 NSLog(@"解析結束");15 for (StudentModel *stu in self.studentArray) {16 NSLog(@"%@",stu);17 }18 }19 20 /**21 * 遇到開始標簽22 */23 - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict{24 NSLog(@"遇到開始節點:%@",elementName);25 if ([elementName isEqualToString:@"student"]) {26 self.studentModel = [[StudentModel alloc]init];27 }28 }29 30 /**31 * 遇到結束標簽32 */33 - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{34 NSLog(@"遇到結束節點:%@",elementName);35 if ([elementName isEqualToString:@"name"]){36 self.studentModel.name = self.str;37 }else if ([elementName isEqualToString:@"age"]){38 self.studentModel.age = self.str;39 }else if ([elementName isEqualToString:@"gender"]){40 self.studentModel.gender = self.str;41 }else if ([elementName isEqualToString:@"student"]) {42 [self.studentArray addObject:self.studentModel];43 }44 }45 46 /**47 * 遇到的值48 */49 - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{50 NSLog(@"%@",string);51 self.str = string;52 }
DOM 解析,先獲取全部文件內容,找出層次結構,需要用到第三方(GDataXMLNode).具體步驟:
1.修改配置 Header Search Paths 加上:/usr/include/libxml2
Other Linker Flags 加上:-lxml2
2.獲取文件路徑
3.獲取文件內容
4.獲取 xml 結構
5.遍歷節點取值
詳細代碼:
1 - (IBAction)xmlParserWithDOM:(id)sender { 2 3 //獲取文件地址 4 NSString *filPath = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"xml"]; 5 NSError *error = nil; 6 //獲取文件內容 7 NSString *contact = [NSString stringWithContentsOfFile:filPath encoding:NSUTF8StringEncoding error:&error]; 8 if (error == nil) { 9 NSLog(@"%@",contact);10 }else {11 NSLog(@"%@",error);12 }13 //第三方14 GDataXMLDocument *document = [[GDataXMLDocument alloc]initWithXMLString:contact options:0 error:nil];15 16 //獲取 xml 根節點17 GDataXMLElement *rootElement = [document rootElement];18 19 //獲取 根節點包含的節點20 NSArray *array = [rootElement elementsForName:@"student"];21 22 NSMutableArray *arr = [[NSMutableArray alloc]init];23 24 //遍歷節點,取值25 for (GDataXMLElement *ele in array) {26 StudentModel *model = [[StudentModel alloc]init];27 model.name = [[[ele elementsForName:@"name"] firstObject] stringValue];28 model.age = [[[ele elementsForName:@"age"] firstObject] stringValue];29 model.gender = [[[ele elementsForName:@"gender"] firstObject] stringValue];30 [arr addObject:model];31 32 }33 34 for (StudentModel *stu in arr) {35 NSLog(@"%@",stu);36 }37 38 }
新聞熱點
疑難解答