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;

}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值