您的位置:首页 > 其它

XML解析的两种解析方式

2014-09-12 09:36 369 查看
     解析:按照一种约定的格式,由后台开发人员按照此格式存储数据,由前台开发人员按照此      格式读取数据.

   

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

   目前比较流行的格式: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);
}

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: