XML_SAX_解析本地文件

87 篇文章 0 订阅

第一步:把文件拖入工程中。

第二步:创建一个与这个文件对应的Model模型,在.h中声明对应的属性,在.m中定义两个方法。

@implementation Student


//防止KVC出错:这是为不识别的key重写的方法

-(void)setValue:(id)value forUndefinedKey:(NSString *)key

{

    if ([key isEqualToString:@"int"]) {

        _age = [value integerValue ];

    }else if ([key isEqualToString:@"NSString"])

    {

        _gender = value ;

    }

    

    //打印出崩溃信息

    NSLog(@"key:%@",key);

    

}


//debug模式校验对象--调试模式下

-(NSString *)description

{

    return [NSString stringWithFormat:@"name:%@,age:%ld,gender:%@,hobby:%@,phone:%@",_name,_age,_gender,_hobby,_phone];

}


@end


第三步:开始解析

    //1.获取文件路径

    NSString *path = [[NSBundle mainBundle] pathForResource:@"StudentInfo_XML" ofType:@"txt"];

    

    //2.根据文件路径来创建data对象

    NSData *data = [[NSData alloc]initWithContentsOfFile:path];

    

    //3.根据data对象来创建解析对象

    NSXMLParser *parser = [[NSXMLParser alloc]initWithData:data];

    

    //4.设置代理对象

    [parser setDelegate:self];

    

    //6.开始解析命令-->实现协议方法

    [parser parse];


其中,第5步为:遵循协议

     

//5.遵循协议

@interface ViewController ()<NSXMLParserDelegate>


第四步:实现代理方法

#pragma mark -- SAX 代理步骤 --

//1.开始文档解析

-(void)parserDidStartDocument:(NSXMLParser *)parser

{

    //准备数组--一次性给我至少6个指针单位的空间,在前一个数上翻倍,6-12-24-48-...

    _array = [[NSMutableArray alloc]initWithCapacity:6];

    

}


//2.开始标签解析

-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict

{

    //记录当前标签

    _currentElement = elementName;

    

    //根据标签建立Model

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

        Student *student = [Student new];

        

        [_array addObject:student];

    }

}


//3.获取标签内容

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

{

    //获取数组最后一个元素

    Student *student = [_array lastObject];

    

    //KVC赋值

    [student setValue:string forKey:_currentElement];

    

}


//4.结束标签解析

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

{

    //当前存储节点置为空,不影响下一次判断

    _currentElement = nil;

}


//后面两步只是在自己写的时候会有,产品上线不要有

//5.结束文档解析

-(void)parserDidEndDocument:(NSXMLParser *)parser

{

    //校验数据

    for (Student *student in _array) {

        NSLog(@"--%@",student);

    }

}


//6.错误处理

-(void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError

{

    NSLog(@"错误为:%@",parseError);

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值