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

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;

@end


ViewController.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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值