XML解析

SAX  : simple API for XML

解析xml數據
- (void)xmlParserUpData{
//  利用的是系統的NSXMLParser
//  xml分析類
//  以驅動事件進行xml的解析(利用觸發得的代理方法解析)
//  特點: 逐行解析

//  獲取路徑
    NSString *path = [[NSBundle  mainBundle] pathForResource:@"Student" ofType:@"xml"];

    //  創建要分析的二進制文件
    NSData *data = [NSData dataWithContentsOfFile:path];

    //  創建分析人
    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];

    //  驅動事件(設置代理)
    parser.delegate = self;

    //  開始分析
    [parser parse];

    [parser release];

}
-----------------------------------------------------------------------

NSXMLParser代理方法實現
//  數組(保存model)
//  model保存節點中間的 值 (字符串)

//  已經開始分析文件
- (void)parserDidStartDocument:(NSXMLParser *)parser{

    self.dataArray = [NSMutableArray array];

    NSLog(@"已經開始分析文件");

}

//  已經開始遇到節點
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{


    //  遇到student節點時初始化student
    if ([elementName isEqualToString:@"Student"]) {

        self.stu = [[Student alloc] init];

    }

//    NSLog(@"<%@>",elementName);
//    NSLog(@"已經開始遇到節點");

}

//  發現字符串
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{

        self.str = string;

//    NSLog(@"%@",string);
//    NSLog(@"發現字符串");

}

//  遇到結束節點
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{


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

        self.stu.name = self.str;

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

        self.stu.gender = self.str;

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

        self.stu.age = self.str;

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

        self.stu.motto = self.str;

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

        [self.dataArray addObject:self.stu];
        [_stu release];

    }


//    NSLog(@"</%@>",elementName);
//    NSLog(@"已經遇到結束節點");

}

//  結束文件分析
- (void)parserDidEndDocument:(NSXMLParser *)parser{

    //  這是裝完所有的model
    NSLog(@"%@",self.dataArray);

    NSLog(@"已經結束文件分析");

}
-----------------------------------------------------------------------

GDataXMLNode第三方類庫解析(Dom解析)

引入谷歌的第三方類庫GDataXMLNode需要引入系統框架libxml2
1. 工程->General-> Linked FrameWorks and Libraries添加;或者在工程->Build Phases->Link Binary With Libraries下添加
2. 工程->Build Settings->Search Paths->Header Search Paths添加路徑 /usr/include/libxml2


- (void)GDataXMLNodeUpData{
//  獲取文件路徑
    NSString *path = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"xml"];

    //  創建一個data對象
    NSData *data = [NSData dataWithContentsOfFile:path];

    //  創建一個空的錯誤對象
    NSError *error = nil;

    //  初始化文件對象
    GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithData:data options:0 error:&error];

    //  獲取根節點
    GDataXMLElement *rootElement = [document rootElement];

//    NSLog(@"%@",[rootElement stringValue]);

    //  獲取根節點下 student節點
    NSArray *elmentArray = [rootElement elementsForName:@"Student"];

    //  初始化數組
    self.dataArray = [NSMutableArray array];

    //  遍歷數組 對每一個sudent節點繼續化整爲零
    for (GDataXMLElement *elment in elmentArray) {

//        //  取出name節點
//        NSArray *nameElmentArray = [elment elementsForName:@"name"];
//        
//        //  從數組中取出name節點的值
//        GDataXMLElement *nameElement = nameElmentArray[0];
//        
//        //  把節點中的值取出來
//        NSString *name = [nameElement stringValue];

        Student *stu = [[Student alloc] init];

        NSString *name = [self dataToString:elment elementName:@"name"];
        stu.name = name;

        NSString *age = [self dataToString:elment elementName:@"age"];
        stu.age = age;

        NSString *gender = [self dataToString:elment elementName:@"gender"];
        stu.gender = gender;

        NSString *motto = [self dataToString:elment elementName:@"motto"];
        stu.motto = motto;

        [self.dataArray addObject:stu];

        //  釋放 ++++++++++++++++
        [stu release];
    }

}


//  1.找報紅的對象(報紅方法中沒有,需要外界傳遞)
//  2.找可變對象(例如name等 需要外界傳遞)
//  3.選好返回值

- (NSString *)dataToString:(GDataXMLElement *)element elementName:(NSString *)elementName{

    //  取出name節點
    NSArray *nameElmentArray = [element elementsForName:elementName];

    //  從數組中取出name節點的值
    GDataXMLElement *nameElement = nameElmentArray[0];

    //  把節點中的值取出來
    NSString *name = [nameElement stringValue];

    return name;

}




發佈了32 篇原創文章 · 獲贊 0 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章