UI - XMLParser


<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

UI - XMLParser_第1张图片

你可能感兴趣的:(数据解析,XMLParser,XML解析总结)