XML数据解析
解析的前提:提前约定好格式、数据提供⽅按照格式提供数据、数据获取⽅则按照格式获取数据。
XML:Extensible Markup language(可扩展标记语⾔),主流数据格式之⼀,可以⽤来存储和传输数据。
SAX解析 —- Simple API for XML
利用的是系统的NSXMLParser,以驱动事件循环进行xml的解析(利用触发的代理方法进行解析)。真谛:逐行解析
解析xml数据
Student.xml如图所示:
// 创建要分析的data(二进制对象)
NSString *path = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"xml"];
NSData *data = [NSData dataWithContentsOfFile:path];
// 创建分析人
NSXMLParser *parser = [[NSXMLParser alloc]initWithData:data];
// 驱动事件(设置代理)
parser.delegate = self;
// 开始分析
[parser parse];
[parser release];
代理方法 (数据转model)
parserDidStartDocument方法和parserDidEndDocument方法只运行一次,而didStartElement方法、foundCharacters方法 和 didEndElement方法循环调用。所以在开始分析文件时初始化数组,用来保存model。在开始遇到节点方法中判断是否是“Student”节点,如果是,则初始化model。在发现字符的方法中保存字符串数据。在遇到结束节点时,将节点之前的数据放到model对应的属性中,比如< / name > 之前的字符保存在model的name属性中。如果结束节点是Student,就把model放进数组,并释放model。
定义数组属性dataArr,用来保存model。并且定义字符串属性 str。
初始化数组 保存model
- (void)parserDidStartDocument:(NSXMLParser *)parser { self.dataArr = [NSMutableArray array]; }
遇到student节点时初始化model
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict { // 遇到student节点时初始化model if ([elementName isEqualToString:@"Student"]) { self.model = [[studentModel alloc]init]; } }
保存字符串
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { // 保存字符串 self.str = string; }
结束节点对model进行赋值
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { if ([elementName isEqualToString:@"Student"]) { [self.dataArr addObject:self.model]; [self.model release]; }else if ([elementName isEqualToString:@"name"]){ self.model.name = self.str; }else if ([elementName isEqualToString:@"gender"]){ self.model.gender = self.str; }else if ([elementName isEqualToString:@"age"]){ self.model.age = self.str; }else { self.model.motto = self.str; } }
DOM解析 —- Document Object Model
Document Object Model(⽂档对象模型)。依靠第三方类库GDataXMLNode,而GDataXMLNode类 依靠系统的libxml2 来实现,所以需要导入libxml2框架。
真谛:把所有的节点一次性读取 并转化为 树形结构 整体解析(与SAX解析的区别)
步骤
导入GDataXMLNode。Student.xml如图所示:
导入libxml2框架
增加查询路径
路径: /usr/include/libxml2
Dom解析方法
- (void)GDataXMLNodeUpdata { NSString *path = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"xml"]; // 创建data NSData *data = [NSData dataWithContentsOfFile:path]; // 创建一个空的错误信息 NSError *error = nil; // 初始化文件对象 GDataXMLDocument *document = [[GDataXMLDocument alloc]initWithData:data options:0 error:&error]; // 获取根节点 GDataXMLElement *rootelement = document.rootElement; // 获取根节点下 Student节点 NSArray *elementArr = [rootelement elementsForName:@"Student"]; // 遍历数组,对每一个Student节点继续化整为零 self.dataArr = [NSMutableArray array]; for (GDataXMLElement *element in elementArr) { StudentModel *model = [[StudentModel alloc]init]; model.name = [self elementInArray:element elementName:@"name"]; model.gender = [self elementInArray:element elementName:@"gender"]; model.age =[self elementInArray:element elementName:@"age"]; model.motto =[self elementInArray:element elementName:@"motto"]; // 把model装进数组 [self.dataArr addObject:model]; [model release]; } } // 1.找爆红的对象(是方法中没有的,需要外界传进来) // 2.找可变的对象 (例如name等 这个也是需要传进来) // 3.选好返回值 - (NSString *)elementInArray:(GDataXMLElement *)element elementName:(NSString *)str { // 取出节点 NSArray *strElementArr = [element elementsForName:str]; // 从数组中取出节点的值 GDataXMLElement *strElement = strElementArr[0]; // 把节点中得值取出来 NSString *string = strElement.stringValue; return string; }
JSON数据解析
Javascript Object Notation,轻量级的数据交换格式,采⽤完全独⽴于语⾔的⽂本格式,被称为理想的数据交换语⾔。
使用Foundation进行JSON解析
真谛:必须要知道Json文件的最外层是什么 []是数组 {}是字典
Teacher.json数据如图所示:
- (void)setUpJsondata
{
NSString *path = [[NSBundle mainBundle] pathForResource:@"Teacher" ofType:@"json"];
NSData *data = [NSData dataWithContentsOfFile:path];
NSError *error = nil;
// 把一个JSON的二进制文件转化成数组或者字典
NSMutableArray *dataArray = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];
}
使用JSONKit进行JSON解析
(还是上图)
- (void)setUpJsondata
{
NSString *path = [[NSBundle mainBundle] pathForResource:@"Teacher" ofType:@"json"];
NSData *data = [NSData dataWithContentsOfFile:path];
// Jsonkit 解析数据
NSArray *array = [data objectFromJSONData];
}