XML解析

#import "ViewController.h"

#import "Student.h"//首先需要新建一个模型,继承自NSObject的类 Student;

@interface ViewController ()<NSXMLParserDelegate> 

//声明变量

@property (nonatomic, strong) NSMutableArray *studentArray;

@property (nonatomic, strong) NSString *string;

@property (nonatomic, strong) Student *student; 

 

@end 

 

@implementation ViewController

//storyboard建立的模板,创建了一个button按钮,点击即可解析;saxBt是按钮的点击事件

- (IBAction)saxBt:(UIButton *)sender { 

    NSString *string = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"xml"];

    //字符创转换格式为url

    NSURL *url = [[NSURL alloc] initFileURLWithPath:string];

    //创建解析类NSXMLParser

    NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:url];

   //接受解析类的代理   

    parser.delegate = self;

    //开始解析

    [parser parse];    

#pragma mark ---- 解析数据的方法------<NSXMLParserDelegate>

- (void)parserDidStartDocument:(NSXMLParser *)parser{

    NSLog(@"开始解析");

//初始化可变数组,以便存放模型

    self.studentArray = [NSMutableArray arrayWithCapacity:0];

}

- (void)parserDidEndDocument:(NSXMLParser *)parser{

    NSLog(@"结束解析"); 

//解析完成打印解析好的放在可变数组内部的模型数据 

    for (Student *student in self.studentArray) {

        NSLog(@"%@",student); //模型内部 .m 文件需要重写(- (NSString *)description;)这个方法

        }

}

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

    NSLog(@"遇到开始标签:%@",elementName);

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

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

    }

}

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

     NSLog(@"遇到结束标签:%@",elementName);

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

        self.student.name = self.string;

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

        self.student.age = self.string;

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

        self.student.gender = self.string;

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

        [self.studentArray addObject:self.student];

    }

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

    NSLog(@"遇到数据内部的内容:%@",string);

    self.string = string;

}

此解析方法速度慢,特点是逐行解析,但是优点数据内部如果有错误,错误之前的数据一样可以解析出来;这个NSXMLParser 类是有自己的方法,使用时需要接受协议并且指定代理对象

 

//XML的数据类型如下

<Students>

    <Student>

        <name>张三</name>

        <age>18</age>

        <gender>男</gender>

    </Student>

    <Student>

        <name>王五</name>

        <age>22</age>

        <gender>男</gender>

    </Student>

    <Student>

        <name>小花</name>

        <age>18</age>

        <gender>女</gender>

    </Student>

    <Student>

        <name>六六</name>

        <age>22</age>

        <gender>女</gender>

    </Student>

</Students>

 

posted @ 2016-02-17 13:40  弓林  阅读(157)  评论(0编辑  收藏  举报