XML解析的两种解析方式

     解析:按照一种约定的格式,由后台开发人员按照此格式存储数据,由前台开发人员按照此      格式读取数据.

   

    解析的本质:按照一定的格式,取出我们想要的数据的过程

   目前比较流行的格式:XML格式  和 JSON格式


  XML解析两种解析的原理

 SAX解析:是一种基于事件回调的解析机制,就是使用协议以及代理,SAX解析是逐行解析,读入数据时只读一行 是一行一行的解析,所以SAX解析所占的内存小,适合大数据解析.


DOM解析:一次性将内容全部读入内存,将内容读成树形结构,逐层解析,适合小的数据解析.

  1.SAX解析的详细步骤

     (1)获取文件路径

   NSString *xmlPath = [[NSBundle mainBundle]           pathForResource:@"Person" ofType:@"xml"];

     (2)根据文件路径初始化NSData对象       

    NSData *data = [NSData dataWithContentsOfFile:xmlPath];

     (3)创建解析工具对象 parser解析

    NSXMLParser *parser = [[NSXMLParser alloc]       initWithData:data];

     (4)设置代理   

    parser.delegate = self;

  (5)开始解析

     [parser parse];

  由上面可以知道设置了代理必须服从协议  ( NSXMLParserDelegate)那么接下来就是实现协议里面以下的方法.

    

//当读取到开始标签时触发

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{

   //当数据存储到开始标签的属性中时,处理方式

    if ([elementName isEqualToString:@"persons"]) {

        //为数据开辟空间

        self.arr = [NSMutableArray array];

        

    }else if ([elementName isEqualToString:@"person"]){

        //Person开辟空间

        self.per =[[[Person alloc] init] autorelease];

        [self.arr addObject:self.per];


    }else if ([elementName isEqualToString:@"name"]){

        self.per.name = attributeDict[@"name"];

    }else if ([elementName isEqualToString:@"gender"]){

        self.per.gender = attributeDict[@"gender"];

    }else if ([elementName isEqualToString:@"age"]){

        self.per.age = attributeDict[@"age"];

    }else if ([elementName isEqualToString:@"phoneNumber"]){

        self.per.phoneNumber = attributeDict[@"phoneNumber"];

    }else if ([elementName isEqualToString:@"imageName"]){

        self.per.imageName = attributeDict[@"iamgeName"];

    }

    //当数据存储在开始标签和结束标签之间时

//    if ([elementName isEqualToString:@"persons"]) {

//        //维数组开辟空间

//        self.arr = [NSMutableArray array];

//    }else if ([elementName isEqualToString:@"person"]){

//        //Person对象开辟空间

//        self.per = [[[Person alloc] init] autorelease];

//    }

}

//当读到标签后的内容时触发

-  (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string

{

    self.str = string;//保存读取到的数据

}


//当读取到结束标签时触发

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName

{

//    if ([elementName isEqualToString:@"name"]) {

//        self.per.name = self.str;

//    }else if ([elementName isEqualToString:@"gender"]){

//        self.per.gender =self.str;

//    }else if ([elementName isEqualToString:@"age"]){

//        self.per.age = self.str;

//    }else if ([elementName isEqualToString:@"imageName"]){

//        self.per.imageName  = self.str;

//    }else if ([elementName isEqualToString:@"phoneNumber"]){

//        self.per.phoneNumber = self.str;

//    }else if ([elementName isEqualToString:@"person"]){

//     //当读到person结束标签时,person对象已经读取完毕,存储到数组中

//        [self.arr addObject:self.per];

//    }

//    NSLog(@"end %@",elementName);


}

//当解析完毕之后触发

- (void)parserDidEndDocument:(NSXMLParser *)parser

{

    NSLog(@"%@",self.arr);

}


 


















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值