Parser 解析
DOM 解析
JSON 解析
现在大部分都是使用JSON解析
stroyboard 里面只有三个button按钮, 分别代表这三种解析.
Parser解析
#import <Foundation/Foundation.h>
#import "Student.h"
@interface ParserXML : NSObject<NSXMLParserDelegate>
// 用一条属性,数组,来装所有解析好的Model对象.
@property(nonatomic, retain)NSMutableArray *stuArr;
//用来临时保存节点内容的字符串.
@property(nonatomic, copy)NSString *tempStr;
// 给一个开始解析的方法,使用减号方法,就需要创建一个对象.使用+好方法,就省去了创建对象的步骤.
- (void)startParser;
@end
#import "ParserXML.h"
#import "Student.h"
@implementation ParserXML
- (void)startParser{
// 根据文件名和类型,获取文件所在路径
NSString *parserPath = [[NSBundle mainBundle]pathForResource:@"Student" ofType:@"xml"];
// 把路径文件内容转换NSData对象保存
NSData *stuData = [NSData dataWithContentsOfFile:parserPath];
// 创建一个mxl的解析工具.
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:stuData];
// 需要设置解析工具的代理人.
parser.delegate = self;
// 开始解析
[parser parse];
}
#pragma mark 开始执行协议中的方法
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{// 这个方法只要一碰到节点系统就会自动走这个方法.
if ([elementName isEqualToString:@"Student"]) {
// 当碰到根节点时,需要对数组进行初始化.
self.stuArr = [NSMutableArray array];
}else if([elementName isEqualToString:@"student"]){
// 碰到二级节点student,意味着这是一个新的对象,需要创建一个对象来接收数据,并且放入到学生数组中.
Student *stu = [[Student alloc] init];
[self.stuArr addObject:stu];
[stu release];
}
}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
//找到节点里面的内容时调用,需要用一个属性来保存对应的节点内容.
// 保存节点内容.
self.tempStr = string;
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
// 只要到节点结束的地方就会走这个方法.
// 没有操作完的对象在数组的最后一个.
Student *stu = [self.stuArr lastObject];
//赋值方法1:
// if ([elementName isEqualToString:@"name"]) {
// stu.name = self.tempStr;
// }
//赋值方法2: KVC
[stu setValue:self.tempStr forKey:elementName];
}
<Student>
<student>
<name>张三</name>
<sex>男</sex>
<age>22</age>
<hobby>女</hobby>
</student>
<student>
<name>李四</name>
<sex>男</sex>
<age>21</age>
<hobby>读书</hobby>
</student>
<student>
<name>王二麻子</name>
<sex>男</sex>
<age>32</age>
<hobby>看美女</hobby>
</student>
<student>
<name>刘鑫狗儿</name>
<sex>男</sex>
<age>23</age>
<hobby>高高姐</hobby>
</student>
</Student>
第二种 XML - DOM
#import "XML - DOM.h"
@implementation XML___DOM
+ (NSMutableArray *)DOMStart{
// 初始化一个用来装Model的容器.
NSMutableArray *stuarr = [NSMutableArray array];
// 将文件内容读取后转化成NAData.
NSString *path = [[NSBundle mainBundle]pathForResource:@"Student" ofType:@"xml"];
NSData *data = [NSData dataWithContentsOfFile:path];
// 用第三方进行数据解析.
//1.要解析数据 //2.没用 //3.错误信息
//错误信息设置成nil,但是如果有问题,nil马上会被错误内容替换.
GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil];
// 获取根节点.
GDataXMLElement *rootElement = [document rootElement];
// 找到根节点,找里面所有的student节点,装在一个数组中.
NSArray *arr = [rootElement elementsForName:@"student"];
//循环遍历所有符合条件的节点
for (NSInteger i = 0; i < arr.count; i++) {
GDataXMLElement *stu = arr[i];
// 创建学生对象
Student *tempStu = [[Student alloc] init];
//继续寻找节点,此处只寻找到了一个name的节点.
GDataXMLElement *stuElement = [[stu elementsForName:@"name"] lastObject];
NSString *nameString = [stuElement stringValue];
tempStu.name = nameString;
[stuarr addObject:tempStu];
[tempStu release];
}
return stuarr;
}
第三种 JSON
也将其他两种方法的调用写出来啦.
- (IBAction)parser:(id)sender {
ParserXML *parser = [[ParserXML alloc] init];
[parser startParser];
for (Student *stu in parser.stuArr) {
NSLog(@"%@",stu.name);
}
}
- (IBAction)DOM:(id)sender {
NSMutableArray *arr = [XML___DOM DOMStart];
for (Student *stu in arr) {
NSLog(@"%@",stu.name);
}
}
// JSON 解析!
- (IBAction)JSON:(id)sender {
// 对本地数据进行解析
NSString *path = [[NSBundle mainBundle]pathForResource:@"movielist" ofType:@"txt"];
NSData *data = [NSData dataWithContentsOfFile:path];
//第二个参数指定一个可变的容器来接受解析之后的数据.
NSMutableDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
// // 打印所有电影名
// NSMutableArray *arr = dic[@"result"];
// for (NSMutableDictionary *DIC in arr) {
// NSLog(@"%@",DIC[@"movieName"]);
// }
NSMutableArray *movieArr = [NSMutableArray array];
for (NSMutableDictionary *DIC in dic[@"result"]) {
Movie *movie = [[Movie alloc] init];
[movie setValuesForKeysWithDictionary:DIC];
[movieArr addObject:movie];
[movie release];
}
}
好吧. 前两种方法太麻烦. 现在就是用JSON解析.