数据解析(SAX, JSON)

数据解析(SAX, JSON)

    为了方便客户端和服务端进行数据的传递, 会对数据的格式进行限定, 主流的数据格式:

    XML: Extensible Marup Language, 可扩展标记语言

    XML数据的特点

    1.有一个根节点

    2.每一个节点, 都有一个父节点和多个子节点

    3.如果一个节点没有父节点, 叫根节点

    4.如果一个节点没有子节点, 叫叶节点

    5.每一个节点都由一个开始标签<>和一个结束标签</>

    6.数据存放在开始标签和结束标签之间

    解析: 从数据中提取有用的信息的过程

    XML的解析方式:

    1.SAX: 逐行解析(读一行, 解析一行), 效率比较低, 遇到错误时, 错误之前的数据都能解析

    2.DOM: 整篇解析(整篇内容读完, 再解析), 效率比较高, 遇到错误, 无法解析

   

    JSON: Javascript Object Natation, 最理想的数据格式

    JSON数据的特点

    1.由数组和字典组成

    2.数组用[]表示

    3.字典用{}表示

    4.数组中的元素, 用逗号隔开

    5.字典中的键值对用逗号隔开

    6.字符串要加双引号

    JSON的解析途径

    1.apple

    2.第三方

                                                            

SAX解析

解析文件
Student.xml
<Students> <student> <name>蹦蹦</name> <age>24</age> <gender>男</gender> </student> <student> <name>张三</name> <age>18</age> <gender>女</gender> </student> <student> <name>李四</name> <age>20</age> <gender>男</gender> </student> </Students>
- (IBAction)sax:(UIButton *)sender {
  NSXMLParser, XML解析类, sax方式, 继承于NSObject  
    //文件的路径
    NSString *path = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"xml"];
    //NSURL, 统一资源定位符
    NSURL *url = [NSURL fileURLWithPath:path];
    //创建解析类
    NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:url];
    //设置代理, 解析的过程在delegate方法中实现
    parser.delegate = self;
    //开始解析
    [parser parse];
    //释放
    [parser release];
}

遵守协议

#pragma mark - NSXMLParserDelegate
- (void)parserDidStartDocument:(NSXMLParser *)parser {
    NSLog(@"文档已经开始解析");
    self.studentArray = [NSMutableArray arrayWithCapacity:3];
}

- (void)parserDidEndDocument:(NSXMLParser *)parser {
    NSLog(@"文档已经结束解析");
    NSLog(@"%@", self.studentArray);
}

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
    NSLog(@"遇到开始标签%@", elementName);
    if ([elementName isEqualToString:@"student"]) {
        student = [[Student alloc] init];
    }
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
     NSLog(@"遇到结束标签%@", elementName);
    if ([elementName isEqualToString:@"name"]) {
        student.name = _content;
    } else if ([elementName isEqualToString:@"age"]) {
        student.age = _content;
    } else if([elementName isEqualToString:@"gender"] ){
        student.gender = _content;
    } else if([elementName isEqualToString:@"student"]){
        [self.studentArray addObject:student];
        NSLog(@"%@", student);
        [student release];
    }
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
    NSLog(@"遇到内容%@", string);
    self.content = string;
}

- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError {
    NSLog(@"解析出现错误%@", parseError);
}
@end
DOM解析类: GDataXMLNode, google提供的DOM解析类
第三方: 除去你和苹果官方的其他代码: Third Part, Vender   
第三方的获取途径
http://www.code4app.com
http://cocoaChina.com
https://github.com
第三方使用的步骤
1.导入工程
 2.配置环境(optional) 
a.导入框架
根据头文件里给的信息修改配置环境


b.配置工程参数
双击右边添加参数




3.引入头文件

- (IBAction)dom:(UIButton *)sender {获取文件路径
    NSString *path = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"xml"];
    根据文件路径, 找到文件, 读取文件内容
    //注: 默认MaxOS下地文字编码格式是UTF-8
    NSString *content = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
    NSLog(@"%@", content);
    GDataXMLDocument: 用于读取文档
    NSError *error = nil;
    GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithXMLString:content options:0 error:&error];
    内容读完以后, 可以分析出整个XML数据的结构
    
    //找根节点
    GDataXMLElement *rootElement = [document rootElement];
    //通过节点名, 找子节点
    NSArray *elements = [rootElement elementsForName:@"student"];
    self.studentArray = [NSMutableArray arrayWithCapacity:3];
    //遍历节点数组
    for (GDataXMLElement *ele in elements) {
        //创建学生对象
        Student *stu = [[Student alloc] init];
        //赋值
        stu.name =  [[[ele elementsForName:@"name"] firstObject] stringValue];
        stu.age = [[[ele elementsForName:@"age"] firstObject] stringValue];
        stu.gender = [[[ele elementsForName:@"gender"] firstObject] stringValue];
        //添加到数组中
        [self.studentArray addObject:stu];
        //释放
        [stu release];
    }
    NSLog(@"%@", self.studentArray);
    
    XPath: 路径检索
    GDataXMLNode是支持XPath的
    // /: 绝对路径 @"student/name"  //: 相对路径 @"//name"
    NSArray *names = [rootElement nodesForXPath:@"//name" error:nil];
    for (GDataXMLElement *ele in names) {
         NSLog(@"%@", [ele stringValue]);
    }
}

JSON方法

解析文件
Student.json [ {
"name": "强强", "age": "18", "gender": "" }, { "name": "蹦蹦", "age": "28", "gender": "" }, { "name": "忠忠", "age": "38", "gender": "" } ]

apple方法

- (IBAction)apple:(UIButton *)sender {
    NSString *path = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"json"];
    NSData, 二进制数据, 继承于NSObject
    NSData *data = [NSData dataWithContentsOfFile:path];
    NSJSONSerialization, JSON解析类(序列化), 继承于NSObject
    参数1: 二进制数据
    参数2: options: NSJSONReadingOptions:
    NSJSONReadingMutableContainers, 生成的数组和字典是可变的
    NSJSONReadingMutableLeaves, 生成的字符串是可变的
    NSJSONReadingAllowFragments, 允许最外层不是数组或字典
    NSError *error = nil;
    NSMutableArray *array = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];
    if (error) {
         NSLog(@"%@", error);
    } else {
        NSLog(@"%@", array);
    }
    
    //数据的封装
    self.studentArray = [NSMutableArray arrayWithCapacity:3];
    for (NSMutableDictionary *dic in array) {
        //1
//        Student *stu = [[Student alloc] init];
//        stu.name = dic[@"name"];
//        stu.age = dic[@"age"];
//        stu.gender = dic[@"gender"];
        
        2.KVC
        Student *stu = [[Student alloc] init];
        [stu setValuesForKeysWithDictionary:dic];
        NSLog(@"%@", stu);
        
        [self.studentArray addObject:stu];
        [stu release];
    }
    NSLog(@"%@", _studentArray);
}

JSON第三方方法

添加文件, 引入头文件

      

- (IBAction)vendor:(UIButton *)sender {
    //获取文件路径
    NSString *path = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"json"];
    //获取二进制数据
    NSData *data = [NSData dataWithContentsOfFile:path];
    NSArray *array = [data objectFromJSONData];
    NSLog(@"%@", array);
}

 

原文地址:https://www.cnblogs.com/OrangesChen/p/4951201.html