OC-数据解析XML(sax)(一)

OC-数据解析XML(sax)(一)

为什么进行解析

用于公司内部数据交互,加密

解析的方法:

(1)XML解析

(2)JSON解析

//oc解析对应

大括号 {} == NSDictionary字典

中括号 [] == NSArray数组

双引号" " == NSString字符串

数字 == NSNumber;

===========================mark=====================================

XML解析1:1:Sax解析:使用系统提供的NSXMLParserDelegate进行解析(从根元素开始,按顺序一个元素一个元素的往下解析,可用于解析大、小文件)

/*Sax解析:

要解析的是什么数据;解析的数据,用什么接收;谁有解析Xml能力;使用代理对象告知解析器什么时候开始解析*/


OC-数据解析XML(sax)(一)_第1张图片



//  Message.h/

//  数据解析XML(Sax)解析#import//modle中设置的属性要和xml中的标签名字一样

@interface Message : NSObject

@property(nonatomic,copy)NSString *receiver;

@property(nonatomic,copy)NSString *content;

@property(nonatomic,copy)NSString *sender;

@end

=======MARK

#import "Message.h"

@implementation Message

//防崩溃

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

}

@end

#import "ViewController.h"

#import "Message.h"@interface ViewController ()//解析时需要使用的数组:

@property(nonatomic,strong)NSMutableArray *dataArray;//定义一个可变字符串@property(nonatomic,strong)NSMutableString *appendString;

- (IBAction)saxfForXML:(UIButton *)sender;

@end@implementation ViewController- (IBAction)saxfForXML:(UIButton *)sender {  

  /*    Sax解析:    要解析的是什么数据    解析的数据,用什么接收    谁有解析Xml能力    使用代理对象告知解析器什么时候开始解析    */   

 //1找到需要解析的数据    NSString *filePath = [[NSBundle mainBundle]pathForResource:@"message.txt" ofType:nil];  

  //2将找到的文件转化为数据   

 NSData *fileData = [NSData dataWithContentsOfFile:filePath];   

 //3创建解析器对象,并给他需要解析的数据  

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

 //4给解析器设置代理    parser.delegate = self;   

 //5通知解析器干活    [parser parse];                            }

//4.1实现协议里的方法//开始解析文档-(void)parserDidStartDocument:(NSXMLParser *)parser{    NSLog(@"开始解析");   

 //定义一个可变存储,用来存储解析出来的文档数据    self.dataArray = [NSMutableArray array];}

//4.2解析标签-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary*)attributeDict{

NSLog(@"开始解析标签");

//获取模型对象

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

//创建模型对象

Message *message = [Message new];

//将模型放入数组当中

[self.dataArray addObject:message];

}

//初始化一个可变字符串,拼接使用

self.appendString = [NSMutableString string];

}

//4.3获取文本

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

NSLog(@"获取文本信息");

//获取文本内容时,未必可以一次性取出,可能多次取出,所以需要拼接

[self.appendString appendString:string];

}

//4.4结束标签解析

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

NSLog(@"结束当前标签");

Message *message = [self.dataArray lastObject];

//使用Kvc,通过key将拼接的字符串给modle

[message setValue:self.appendString forKey:elementName];

//拼接完毕,需要对字符串进行清空

self.appendString = nil;

}

//4.5:结束解析文档:

-(void)parserDidEndDocument:(NSXMLParser *)parser

{

NSLog(@"结束解析文档");

//将数组中存储的对象打印出来.进行测试

[self.dataArray enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {

NSLog(@"%@,%@,%@",[obj receiver],[obj content],[obj sender]);

}];

}

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

{

NSLog(@"解析文档出错:%@",parseError);

}

- (void)viewDidLoad {

[super viewDidLoad];

}

- (void)didReceiveMemoryWarning {

[super didReceiveMemoryWarning];

// Dispose of any resources that can be recreated.

}

@end

//源文件百度云:链接: https://pan.baidu.com/s/1pLjWZ5T 密码: 96ca

你可能感兴趣的:(OC-数据解析XML(sax)(一))