UI数据解析(Dom,Sax,Json)

来源:互联网 发布:烯牛数据 编辑:程序博客网 时间:2024/05/24 04:06
ViewController.h文件#import <UIKit/UIKit.h>#import "Students.h"#import "GDataXMLNode.h"@interface ViewController : UIViewController<NSXMLParserDelegate>//学生数组@property(nonatomic,strong)NSMutableArray *stuArray;//临时变量,记录标签中的值@property(nonatomic,strong)NSString *tempStr;@endViewController.m文件#import "ViewController.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad {    [super viewDidLoad];   /* //解析的基本概念    //XML数据结构    //JSON数据结构    1.进行XML数据结构解析时使用到SAX工具,DOM工具    2.进行JSON数据结构解析时使用到第三方框架以及系统方法    //解析的基本概念    所谓'解析':从事先规定好的格式中提取数据    解析的前提:提前约定好格式,数据提供方按照格式提供数据,数据获取方则按照格式获取数据    iOS开发常见的解析:XML解析、json解析    XML数据结构    xml:Extensibale Markup Language(可扩展标记语言)    主流数据格式之一,可以用来存储和传输数据    SAX:Simple APi for XML. 基于事件驱动的解析方式,逐行解析数据(采用协议回调机制)    DOM:Document Object Model(文档对象模型). Dom方式解析XML时,读入整个xml文档并构建一个驻留内存的树结构(节点树),通过遍历树结构可以检索任意XML节点,读取它的属性和值.而且通常情况下,可以借助Xpath,直接查询XML节点.    */}#pragma -mark sax解析- (IBAction)SAXButton:(id)sender {    //1.获取文件路径    NSString *path = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"xml"];    //2.转成数据    NSData *data = [NSData dataWithContentsOfFile:path];    //3.创建解析类    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];    //4.授权    parser.delegate = self;    //5.开始解析    [parser parse];}#pragma -mark sax解析的代理方法//发现标签开始处理函数(即报告元素的开始以及元素的属性)-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict{    //当发现student节点的时候初始化数组准备装学生    if ([elementName isEqualToString:@"students"]) {        _stuArray = [NSMutableArray array];    }    //当发现学生的时候,创建一个学生对象并加入数组    else if ([elementName isEqualToString:@"student"])    {        Students *stu = [[Students alloc] init];        [_stuArray addObject:stu];    }}//记录临时变量:处理标签包含内容字符(报告标签的所有或者部分内容)-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{    //临时变量记录节点内容    self.tempStr = string;}//发现标签结束符的处理函数,保存标签各项数据(即报告标签的结束标记)-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{    //从数组中取出学生 赋值    Students *stu = [_stuArray lastObject];    //赋值//    if ([elementName isEqualToString:@"name"]) {//        stu.name = _tempStr;//    }else if ([elementName isEqualToString:@"sex"])//    {//        stu.sex = _tempStr;//    }else if ([elementName isEqualToString:@"number"])//    {//        stu.number = _tempStr;//    }else//    {//        stu.phone = _tempStr;//    }//    //kvc赋值    //可以用kvc赋值(要在students对象中添加一个方法)    //-(void)setValue:(id)value forUndefinedKey:(NSString *)key    [stu setValue:_tempStr forKey:elementName];}//解析完成(报告解析的结束)-(void)parserDidEndDocument:(NSXMLParser *)parser{    NSLog(@"解析完成");    for (Students *stu in _stuArray) {        NSLog(@"%@",stu.name);    }}#pragma -mark Dom解析- (IBAction)DomButton:(id)sender {    //Dom解析需要以下几个步骤:    //1.header search path 中添加${SDKROOT}/usr/include/libxml2    //2.添加libxml2依赖库    //3.mrc转arc  在Build Phases 的compile Sources 中添加进来的文件后面加上 -fno-objc-arc    //1.获取文件路径    NSString *path = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"xml"];    //2.转NSData    NSData *data = [NSData dataWithContentsOfFile:path];    //3.数组初始化    _stuArray = [NSMutableArray array];    //装载数据(把完成的data丢到内存)    GDataXMLDocument *docuemnt = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil];    //获取根节点    GDataXMLElement *rootElement = [docuemnt rootElement];    //获取子节点    NSArray *array = [rootElement elementsForName:@"student"];    //遍历数组获取数据    for (GDataXMLElement *element in array) {        Students *stu = [[Students alloc] init];        //赋值(需要强转)        stu.number = [[[element elementsForName:@"number"] lastObject] stringValue];        stu.sex = [[[element elementsForName:@"sex"] lastObject] stringValue];        stu.phone = [[[element elementsForName:@"phone"] lastObject] stringValue];        stu.name = [[[element elementsForName:@"name"] lastObject] stringValue];        [_stuArray addObject:stu];    }    for (Students *stu in _stuArray) {        NSLog(@"%@",stu.name);    }}#pragma -mark JSON解析- (IBAction)JsonButton:(id)sender {   //获取要解析的文件路径    //将文件转化成数据类型(NSData)    //解析    NSString *path = [[NSBundle mainBundle] pathForResource:@"Student1" ofType:@"txt"];    NSData *data = [NSData dataWithContentsOfFile:path];    //解析    NSArray *array = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];    NSLog(@"%ld",[array count]);    //初始化学生数组    NSMutableArray *array1 = [NSMutableArray array];    //遍历数组取出学生    for (NSMutableDictionary  *dic in array) {        Students *stu = [[Students alloc] init];        [stu setValuesForKeysWithDictionary:dic];        [array1 addObject:stu];    }    for (Students *stu in array1) {        NSLog(@"%@",stu.name);    }}- (void)didReceiveMemoryWarning {    [super didReceiveMemoryWarning];    // Dispose of any resources that can be recreated.}@end
1 0