OC-数据解析XML(sax)(一)
为什么进行解析
用于公司内部数据交互,加密
解析的方法:
(1)XML解析
(2)JSON解析
//oc解析对应
大括号 {} == NSDictionary字典
中括号 [] == NSArray数组
双引号" " == NSString字符串
数字 == NSNumber;
===========================mark=====================================
XML解析1:1:Sax解析:使用系统提供的NSXMLParserDelegate进行解析(从根元素开始,按顺序一个元素一个元素的往下解析,可用于解析大、小文件)
/*Sax解析:
要解析的是什么数据;解析的数据,用什么接收;谁有解析Xml能力;使用代理对象告知解析器什么时候开始解析*/
// 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