加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

XML_SAX_解析本地文件

发布时间:2020-12-16 06:06:49 所属栏目:百科 来源:网络整理
导读:第一步:把文件拖入工程中。 第二步:创建一个与这个文件对应的Model模型,在.h中声明对应的属性,在.m中定义两个方法。 @implementation Student // 防止 KVC 出错 : 这是为不识别的 key 重写的方法 -( void )setValue:( id )value forUndefinedKey:( NSStr

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

第二步:创建一个与这个文件对应的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);

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读