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來決定


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章