UI一揽子计划 15 (XML的解析方式 (SAX解析/ DOM解析) 、JSON 解析)

一. XML的SAX解析
1).SAX解析  
     1. 遵守协议
     @interface RootViewController ()< NSXMLParserDelegate >
     2. 声明属性
// 声明一个属性   可变数组 存放 model
     @property ( nonatomic , retain ) NSMutableArray *dataArray;
     // 需要声明一个 model 的属性
     @property ( nonatomic , retain ) StudentModel *model;
     // 声明一个字符串   用来保存数据的内容
     @property ( nonatomic , retain ) NSString *str;
   
     3.  NSXMLParser 分析 XML 文件
- ( void)setUpDataXMLParser
{
     *  XML SAX 解析
    // Path
   
NSString *path = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"xml"];
   
// NSData
   
NSData *data = [NSData dataWithContentsOfFile:path];
   
// 创建一个分析人
   
NSXMLParser *parser = [[NSXMLParser alloc]initWithData:data];
   
// 设置代理
    parser.
delegate = self;
   
// 解析数据(开始分析) 利用代理协议方法 进行数据分析
    [parser
parse];
   
// 我在这里释放  行不行???
   
NSLog(@"我在这里释放  !");
   
// 内存管理
    [parser
release];
}
  4.
 *1. 把数据取出来
 *2. 装进 Model
 *3. Model 装进数组 备用


#pragma mark -- NSXMLParser代理方法
- ( void )parserDidStartDocument:( NSXMLParser *)parser
{
   
NSLog ( @" 开始分析文件 " );
   
// 初始化数组
   
self . dataArray = [ NSMutableArray array ];
}
// 找节点
- (
void )parser:( NSXMLParser *)parser didStartElement:( NSString *)elementName namespaceURI:( NSString *)namespaceURI qualifiedName:( NSString *)qName attributes:( NSDictionary *)attributeDict
{
  
// NSLog(@" 开始遇到节点 ");
   
NSLog ( @"<%@>" , elementName);
   
// 初始化 model
   
if ([elementName isEqualToString : @"Student" ]) {
       
self . model = [[ StudentModel alloc ] init ];
    }
}

- (
void )parser:( NSXMLParser *)parser foundCharacters:( NSString *)string
{
  
// NSLog(@" 发现字符触发 ");
   
NSLog ( @"%@" , string);
   
self . str = string;

}

- (
void )parser:( NSXMLParser *)parser didEndElement:( NSString *)elementName namespaceURI:( NSString *)namespaceURI qualifiedName:( NSString *)qName
{
  
// NSLog(@" 遇到节点结束触发 ");
   
NSLog ( @"</%@>" , elementName);
   
if ([elementName isEqualToString : @"name" ]) {
       
self . model . name = self . str ;
    }
else if ([elementName isEqualToString : @"gender" ]) {
       
self . model . gender = self . str ;
    }
else if ([elementName isEqualToString : @"age" ]) {
       
self . model . age = self . str ;
    }
else if ([elementName isEqualToString : @"motto" ]) {
       
self . model . motto = self . str ;
    }
else if ([elementName isEqualToString : @"Student" ]) {
       
// 节点名等于 Student 的时候 一个 model 就赋值完成了 这时候 装进数组里
        [
self . dataArray addObject : self . model ];
        [
_model release ];
    }
    
}
- ( void )parserDidEndDocument:( NSXMLParser *)parser
{
   
NSLog ( @" 已经结束分析文件 " );
    NSLog(@"%@", self.dataArray);
}
2).DOM解析  (关于文件详细配置及其他  请查阅     GDataXMLNode.m)
1.   使用GDataXmlNode 这个类库 来实现
    直接导入类库 会报错  报错的原因 : GDataXmlNode 基于libxml 来写的
          必须把libxml 导入
2.
- (void)setUpDataGDataXmlNode
{
    // 创建路径
    NSString *path = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"xml"];
   
// NSData
   
NSData *data = [NSData dataWithContentsOfFile:path];
   
   
// 利用XMLNode 进行DOM 解析
    // data 初始化管理文件 的对象  转化成树形结构    error 如果解析失败的话可以打印出理由
    // 创建空的错误信息
   
NSError *error = nil;
   
GDataXMLDocument *document = [[GDataXMLDocument alloc]initWithData:data options:0 error:&error];
   
// 获取根节点
   
   
GDataXMLElement *rootElement = [document rootElement];
   
   
// 从根节点开始打印 把所有的东西都打印出来了
   
NSLog(@"%@", rootElement);
   
   
// 获取根节点下Student节点
   
NSArray *Studentrray = [rootElement elementsForName:@"Student"];
   
   
NSLog(@"%@", Studentrray);
   
// 遍历Student节点的数组
   
self.dataArray = [NSMutableArray array];

   
for (int i = 0; i < Studentrray.count; i++) {
       
// 取出每一个学生节点
       
GDataXMLElement *oneStudentElement = Studentrray[i];
       
// 取出oneStudentElement 节点下的name 数组
       
NSArray *nameArray = [oneStudentElement elementsForName:@"name"];
       
// 取出name 节点
       
GDataXMLElement *nameElement = nameArray [0];
       
// 转化为字符串
      
NSString *name = [nameElement stringValue];
       
NSLog(@"%@", name);
       
       
NSString *gender = [self backStringWithElement:oneStudentElement Forname:@"gender"];
       
NSLog(@"%@", gender);
       
NSString *age = [self backStringWithElement:oneStudentElement Forname:@"age"];
       
NSLog(@"%@", age);

       
NSString *motto = [self backStringWithElement:oneStudentElement Forname:@"motto"];
       
NSLog(@"%@", motto);
       
       
// Model 赋值初始化一个model
       
StudentModel *model = [[StudentModel alloc]init];
        model.
name = name;
        model.
gender = gender;
        model.
age = age;
        model.
motto = motto;
        [
self.dataArray addObject:model];
       
        [model
release];
    }
   
NSLog(@"%@", self.dataArray);
}

// 将取出名字的方法封装起来
- (
NSString *)backStringWithElement:(GDataXMLElement *)element Forname:(NSString *)name
{
   
NSArray *array = [element elementsForName:name];
   
GDataXMLElement *element1 = array [0];
   
return [element1 stringValue];
}

二.JSON解析
1). Json 解析
- ( void)setUpJson
{
   
NSString *path = [[NSBundle mainBundle] pathForResource:@"Teacher" ofType:@"json"];
   
NSData *data = [NSData dataWithContentsOfFile:path];
   
// data 转化成可变数组或者可变字典  是字典还是数组 要看json 最外层是什么.
   
// 使用 jsonKit 来解析数据
   
//NSMutableArray *jsonArray =[data objectFromJSONData];
 
//  NSJSONSerialization     json解析使用的类
   
NSMutableArray *dataArray = [NSJSONSerialization JSONObjectWithData:data options:(NSJSONReadingMutableContainers) error:nil];
   
// 剥香蕉
   
self.dataArray = [NSMutableArray array];
   
for (NSDictionary *dic in dataArray) {
       
TeacherModel *model = [[TeacherModel alloc]init];
        [model
setValuesForKeysWithDictionary:dic];
        [
self.dataArray addObject:model];
        [model
release];
    }
   
NSLog(@"%@", self.dataArray);
}

2) . - (void)setUpdata
{
   
NSString *path = [[NSBundle mainBundle] pathForResource:@"area" ofType:@"json"];
   
NSData *data = [NSData dataWithContentsOfFile:path];
   
NSMutableArray *jsonArray = [NSJSONSerialization JSONObjectWithData:data options:(NSJSONReadingMutableContainers) error:nil];
   
   
self.dataArray = [NSMutableArray array];
   
for (NSDictionary *dic in jsonArray) {
       
CityModel *model = [[CityModel alloc]init];
        [model
setValuesForKeysWithDictionary:dic];
        [
self.dataArray addObject:model];
       
NSLog(@"%@", model.province);
        [model
release];
    }
   
NSLog(@"%@", self.dataArray
);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值