您的位置:首页 > Web前端 > Node.js

Parse终极总结

2016-01-11 21:33 731 查看
解析:从实现规定好的格式中提取数据.
解析的前提:提前约定好格式,数据提供按照格式提供好数据,数据接收方按照格式获取数据,这就是前提

两种格式:XML格式, Json格式
解析XML格式:NSXMLParser, GData
解析Json格式:JsonSerialization, JsonKit

1 XML
Extensible Markup Language  (可扩展的标记语言), 主流数据之一,可用来存储和传输数据
例如:Message.txt



XML的作用: 配置文件, 内容管理, 数据交换
XML的解析方式有两种:1.1 SAX解析,  1. 2 DOM解析
1.1 SAX解析:
simple API for XML
基于事件机制的解析方式,采用逐行解析数据(采用协议回调机制)
点击解析button方法中:
#pragma mark --- SAX解析
- (void)SexXmlAction {
// 模拟从网络上拿到数据
NSString *path = [[NSBundle mainBundle] pathForResource:@"Message" ofType:@"txt"];
NSData *data = [NSData dataWithContentsOfFile:path];
// 开始解析
// 1 创建解析对象,绑定数据
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
// 2 指定代理
parser.delegate = self;
// 3 开始解析
[parser parse];
}

在button方法外直线代理的方法:
// 4 实现代理的方法
- (void)parserDidStartDocument:(NSXMLParser *)parser {
// NSLog(@"开始解析文档");
self.data = [NSMutableArray array];
}
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict {
//    NSLog(@"开始解析标签");
if ([elementName isEqualToString:@"person"]) {
Person *p = [[Person alloc] init];
[self.data addObject:p];
}
self.currentElement = elementName;
self.tempString = [NSMutableString string];
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
//    NSLog(@"解析中间数据项");
[self.tempString appendString:string];

}

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

Person *p = [self.data lastObject];
//  利用KVC进行属性赋值
[p setValue:self.tempString forKey:self.currentElement];
//    NSLog(@"结束解析标签");
self.currentElement = nil;
self.tempString = nil;
}

- (void)parserDidEndDocument:(NSXMLParser *)parser {
//    NSLog(@"结束解析文档");
for (Person *p in self.data) {
NSLog(@"%@--%@--%@", p.name, p.sex, p.info);
}
}

- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError {
NSLog(@"OMG,文档有毒!!!");
}


1. 2 使用DOM方式解析XML:

DOM -> document object model (文档对象模型)

    
解析的时候 将文档整体的读入,并将XML结构化成树状,使用时,通过树枝来获取.

     dom解析方式比较好的一个实现是Google提供的GData,是开源的,他是对libxml.dylib的封装,也就是说需要导入类库



<span style="font-size:14px;">#pragma mark --- 使用DOM方式解析XML
- (void)DomXmlAction {
// 模拟从网络上拿到数据
NSString *path = [[NSBundle mainBundle] pathForResource:@"Message" ofType:@"txt"];
NSData *data = [NSData dataWithContentsOfFile:path];
// 开始解析
// 1 创建解析对象 绑定数据源data
GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil]; // doc 代表整个XML文档
// 2 拿到根节点
GDataXMLElement *root = doc.rootElement;
// 拿到子节点
NSArray *modelArray = root.children;
// 初始化data数组
self.data = [NSMutableArray array];
// 遍历数组取到每一个model对应的节点
for (GDataXMLElement *modelEle in modelArray) {
Person *p = [[Person alloc] init];
// 获得属性节点数组
NSArray *proArray = modelEle.children;
for (GDataXMLElement *proEle in proArray) {
[p setValue:proEle.stringValue forKey:proEle.name];
}
[self.data addObject:p];
}

// 循环打印,查看结果
for (Person *p in self.data) {
NSLog(@"%@--%@--%@", p.name, p.sex, p.info);
}
}</span>

2. Json格式数据:
javascript object notation 轻量级数据交换格式,被称为理想的数据交换语言
在Json中只有两种东西:   对象,数据
例如:Json.txt



2. 1 解析Json格式数据有两种方式:
JsonKit  (第三方)



#pragma mark --- 使用JSONKit进行解析
- (void)JSONKitAction {
// 模拟从网络上获取数据
NSString *path = [[NSBundle mainBundle] pathForResource:@"Json" ofType:@"txt"];
NSData *data = [NSData dataWithContentsOfFile:path];
// 1 直接从data中拿对象
NSArray *array = [data objectFromJSONData]; // 这个数组是一个成员变量为字典的数组
// 2 初始化数组
self.data = [NSMutableArray array];
// 3 遍历数组
for (NSDictionary *dic in array) {
Person *p = [[Person alloc] init];
[p setValuesForKeysWithDictionary:dic];
[self.data addObject:p];
}
// 4 循环打印,查看结果
for (Person *p in self.data) {
NSLog(@"%@--%@--%@", p.name, p.sex, p.info);
}
}

2. 2  使用系统提供的类NSJSONSerialization进行JSON解析

<span style="font-size:14px;">#pragma mark --- 使用系统提供的类进行JSON解析
- (void)JSONSerializationAction {
// 模拟数据的获取
NSString *path = [[NSBundle mainBundle] pathForResource:@"Json" ofType:@"txt"];
NSData *data = [NSData dataWithContentsOfFile:path];
NSArray *arr = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
self.data = [NSMutableArray array];
for (NSDictionary *dic in arr) {
Person *p = [[Person alloc] init];
[p setValuesForKeysWithDictionary:dic];
[self.data addObject:p];
}
for (Person *p in self.data) {
NSLog(@"%@--%@--%@", p.name, p.sex, p.info);
}

}</span>

上面所用的模Person

Person.h中

#import <Foundation/Foundation.h>

@interface Person : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *sex;
@property (nonatomic, copy) NSString *info;
@end
Person.m中

由于在解析时往self.data中添加时用到了<span style="font-size:14px;">p setValuesForKeysWithDictionary:dic,所以为了安全在Person.m中不要忘记这句话</span>

#import "Person.h"

@implementation Person

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

}

@end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息