xml解析数据

#import "GDataXMLNode.h"//引第三方头文件
#import "JSONKit.h"//引第三方头文件 

@interface RootViewController : UIViewController<NSXMLParserDelegate>//协议

@property(nonatomic,retain)NSMutableArray *allStudentArray;
@property(nonatomic,copy)NSString *currentElement;//记录当前的标签 


xml解析数据有两种方法:
1.SAX解析
2.DOM解析
 
SAX解析
特点:对xml格式数据进行逐步解析,就是从上到下,一行一行解析
优点:不会将xml数据读取到内存上,不占内存,适合解析大型数据
缺点:效率低,不能读取指定位置的数据,只能从上到下逐行解析

-(void)xmlbuttonAction:(UIButton *)btn
{
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Students" ofType:@"txt"];
    NSData *data = [NSData dataWithContentsOfFile:filePath];
    //系统提供SAX解析类
    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
    parser.delegate = self;
    //开始解析
    [parser parse];
   
}

//解析开始
-(void)parserDidStartDocument:(NSXMLParser *)parser
{
    NSLog(@"解析开始");
    self.allStudentArray = [NSMutableArray array];
}

//解析开始标签名
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
    NSLog(@"开始标签名 = %@", elementName);
    if ([elementName isEqualToString:@"stu"])
    {
        //一个stu开始标签对应一个学生对象
        Student *stu = [[Student alloc] init];
        [self.allStudentArray addObject:stu];
        [stu release];
    }
   
    //始终记录着当前标签名
    self.currentElement = elementName;
   
}

//解析标签值
-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
    //取出数组最后一个对象,也就是新加入的对象
    Student *stu = [self.allStudentArray lastObject];
//    if (self.currentElement isEqualToString:@:"number")
//    {
//        stu.number = string;
//    }
//    if (self.currentElement isEqualToString:@:"name")
//    {
//        stu.name = string;
//    }
//    if (self.currentElement isEqualToString:@:"address")
//    {
//        stu.address = string;
//    }
//    if (self.currentElement isEqualToString:@:"time")
//    {
//        stu.time = string;
//    }
   
    //KVC
    [stu setValue:string forKey:self.currentElement];
   
    //NSLog(@"值 = %@", string);
}

//解析结束标签名
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
    NSLog(@"结束标签名 = %@", elementName);
   
    //防止覆盖
    self.currentElement = nil;
   
    for (Student *stu in self.allStudentArray)
    {
        NSLog(@"%@ %@ %@", stu.name, stu.number, stu.address);
    }
}

//解析结束
-(void)parserDidEndDocument:(NSXMLParser *)parser
{
    NSLog(@"解析结束");
}


DOM解析 是谷歌公司08年提供的一个xml解析工具
 特点:将整个xml文件数据以树形结构的形式储存到内存上,然后进行读取
 优点:效率快,可以读取指定位置的数据
 缺点:耗内存,不适合读取大型数据

-(void)dombuttonAction:(UIButton *)btn
{
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Students" ofType:@"txt"];
    NSData *data = [NSData dataWithContentsOfFile:filePath];
    //创建dom解析对象
    //参数1.data类型的数据
    //参数2.苹果备用信息(无用)
    //参数3.错误信息
    NSError *error = nil;//初始化错误对象
   
    //1.将数据以树形结构读取到内存上
    GDataXMLDocument *xmlDocument = [[GDataXMLDocument alloc] initWithData:data options:0 error:&error];
    NSLog(@"error = %@", error);
   
    //2.得到根节点
    GDataXMLElement *rootElement = xmlDocument.rootElement;
    NSLog(@"====%@", rootElement);
   
    self.allStudentArray = [NSMutableArray array];
   
    //3.遍历找到根节点<student>上的所有子节点
    for (GDataXMLElement *subElement in rootElement.children)
    {
        Student *stu = [[Student alloc] init];
       
        //4.遍历节点<stu>上的子节点<name>,<number>,<address>等
        for (GDataXMLElement *element in subElement.children)
        {
            NSLog(@"value = %@, name = %@", element.stringValue, element.name);
            [stu setValue:element.stringValue forKey:element.name];
        }
        [self.allStudentArray addObject:stu];
        [stu release];
    }
   
    for (Student *stu in self.allStudentArray)
    {
        NSLog(@"name = %@ number = %@ address = %@", stu.name, stu.number, stu.address);
    }
   
  
}





//JSONKit
-(void)jsonbuttonAction:(UIButton *)btn
{
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Teachers" ofType:@"txt"];
    NSData *data = [NSData dataWithContentsOfFile:filePath];
   
    //使用JSONKit进行数据解析
    NSMutableArray *array = [data objectFromJSONData];
    NSLog(@"array = %@", array);
   
    //使用系统类解析json数据
    NSMutableArray *array2 = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
    NSLog(@"array2 = %@", array2);
}

 针对数据解析,不管是xml还是json,最终目的就是将网络或者本地文件中的数据取出来,存入到model属性中,并存入数组.modol属性名字根据key来决定


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值