<ViewController.h>
#import <UIKit/UIKit.h> @interface ViewController : UIViewController @end
<ViewController.m>
#import "ViewController.h" #import "GDataXMLNode.h" @interface ViewController ()<NSXMLParserDelegate> @property (nonatomic,copy)NSString *toName;//收件人 @property (nonatomic,copy)NSString *fromName;//发件人 @property (nonatomic,copy)NSString *messageContent;//内容 @property (nonatomic,copy)NSString *date;//日期 @property (nonatomic,copy)NSString *content;//存储标签内的内容 @property (nonatomic,retain)NSMutableDictionary *categoryDic; //存储解析后的数据 @property (nonatomic,retain)NSMutableArray *categoryArr;//存储类别数据 @end @implementation ViewController /* 解析:以一种约定好的格式,后台开发人员将数据进行存储,前端开发人员按照这种格式进行数据的读取过程,数据的格式由后台开发人员决定,我们无权规定; 当今比较流行的两种数据形式为 XML 和 JSON , 其实对我们来说,解析就是从 XML 或者 JSON 数据格式中进行数据的获取; 1.XML 解析有两种方式: SAX 解析和 DOM 解析; SAX解析: SAX解析基于事件回调,也就是通过代理协议方法回调的方式进行数据解析,也就是将数据一行一行读入内存,然后一行一行地进行数据的获取; 2.DOM 解析:DOM 解析是将数据整体读入内存,形成属性的数据结构形式,然后根据属性结构特点进行数据堆区,适合小型的数据,一般我们使用 Google 提供的第三方开源类库 GDataXMLNode */ // ================================ SAX解析 ================================== // SAX解析 - (IBAction)SAXXMLParser:(id)sender { //创建外部字典 self.categoryDic = [NSMutableDictionary dictionary]; NSString *filePath = [[NSBundle mainBundle]pathForResource:@"Categories 2" ofType:@"xml"]; //1.获取文件路径 // NSString *filePath = [[NSBundle mainBundle]pathForResource:@"Message" ofType:@"xml"]; //2.通过路径获取 NSData 数据对象 NSData *parserData = [NSData dataWithContentsOfFile:filePath]; //3.创建解析对象 NSXMLParser *parser = [[NSXMLParser alloc]initWithData:parserData]; //4.设置代理 parser.delegate = self; //5.开始解析 ,下面的代理方法都是由这步开始执行的 [parser parse]; //6.对解析后的数据进行处理 // NSLog(@"发件人:%@,收件人:%@,内容:%@,时间:%@",self.fromName,self.toName,self.messageContent,self.date); // //遍历数据字典 for (NSString *key in _categoryDic) { //通过 key 获取对应分组 NSMutableArray *group = [_categoryDic valueForKey:key]; //遍历分组 for (NSString *str in group) { NSLog(@"%@",str); } } } #pragma mark - ParserDelegate //读取到开始标签 -(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict { //打印开始标签的名字 NSLog(@"%@",elementName); //读取到category_name的时候进行数组的创建 if ([elementName isEqualToString:@"category_name"]) { self.categoryArr = [NSMutableArray array ]; } } //读取到内容 -(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { //打印内容 NSLog(@"%@",string); //获取内容 self.content = string; } //读取到结束标签 -(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { //打印结束标签名字 NSLog(@"%@",elementName); // //将读取的值赋给属性 // if ([elementName isEqual:@"to"]) { // self.toName = _content; // }else if ([elementName isEqual:@"content"]) // { // self.messageContent = _content; // }else if ([elementName isEqual:@"from"]) // { // self.fromName = _content; // }else if ([elementName isEqual:@"date"]) // { // self.date = _content; // } if ([elementName isEqualToString:@"category_name"]) { [self.categoryDic setValue:self.categoryArr forKey:_content]; NSLog(@"11111"); }else { //NSLog(@"dsakjfewklhfnklsd"); //存储_ conten 内容 [_categoryArr addObject:_content]; } } //========================= DOM 解析 ======================== //对于 DOM 解析我们需要进行三步配置: //1.在 Build Phases 中的 Link Binary With Libraries 中导入动态链接库, libxml2.2.dylib //2.在 build setting 中的 Header Search Paths 中添加 /usr/include/libml2 //3.在 build setting 中的 Other Linker Flags 中添加 -lxml2 //DOM 解析 - (IBAction)DOMXMLParser:(id)sender { //1.获取文件路径 NSString *filePath = [[NSBundle mainBundle ]pathForResource:@"Categories 2" ofType:@"xml"]; //2.初始化 xmlString NSString *xmlString = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil]; //3.将 xmlString 读入 GDataXMLDocument GDataXMLDocument *document = [[GDataXMLDocument alloc]initWithXMLString:xmlString options:0 error:nil]; //绝对路径方法获取节点 // //4.获取根节点 // GDataXMLElement *rootElement = [document rootElement]; // //5.获取子节点 // NSArray *elements = [rootElement elementsForName:@"categories"];//需要用数组接收 // GDataXMLElement *element = [elements firstObject]; // // NSArray *categoryArr = [element elementsForName:@"subcategories"]; // for (GDataXMLElement *a in categoryArr) { // NSLog(@"%@",[a stringValue]); // } //4.根据相对路径进行节点获取 NSArray *elements = [document nodesForXPath:@"//subcategories" error:nil]; for (GDataXMLElement *element in elements) { NSLog(@"%@",[element stringValue]); } } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end