网络解析

1、xml解析--系统的SAX解析,逐行

    在 Build Phases中 Link Binary With Libraries 添加 libxml2.tbd,同时Build Settings 中搜索 header search paths 添加/usr/include/libxml2

    ①遵循NSXMLParserDelegate协议

    ②

 1 //1、获取文件路径
 2     NSString *path = [[NSBundle mainBundle]pathForResource:@"XML" ofType:@"txt"];
 3     
 4     //2、通过路径创建一个data对象
 5     NSData *data = [NSData dataWithContentsOfFile:path];
 6     
 7     //3、创建SAX解析使用的对象
 8     NSXMLParser *xmlParser = [[NSXMLParser alloc]initWithData:data];
 9     
10     //4、遵循代理;
11     xmlParser.delegate = self;
12     
13     //5、开始解析
14     [xmlParser parse];

#pragma mark ---NSXMLParserDelegate 方法---
//1、开始解析XML文档
- (void)parserDidStartDocument:(NSXMLParser *)parser{
    //准备数据(自动根据数组元素个数开辟空间最好先给0)
    self.dataArray = [NSMutableArray arrayWithCapacity:0];
    
}

//2、开始解析标签的方法
/**
 *  @param parser        类
 *  @param elementName   标签名
 *  @param namespaceURI  <#namespaceURI description#>
 *  @param qName         <#qName description#>
 *  @param attributeDict <#attributeDict description#>
 */
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict{
    //获取到当前正在解析的标签,给标签属性赋值
    _currentElement = elementName;
    
    //如果当前解析到的标签值为“student”(model预建立)
    if ([elementName isEqualToString:@"student"]) {
        //创建并初始化model,并添加到数据源
        Student *stu = [Student new];
        [self.dataArray addObject:stu];
    }
}


//3、循环读取标签的值:这个方法,得到节点里面存的信息数据
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
    //将值存入model类对应的属性中,循环执行,需要取最后一个【包<student></student>是按照顺序扔进数组的,挨个进行取值,所有只取最后一个,说明全部取完】
    Student *stu = self.dataArray.lastObject;
    
    //根据当前已经解析出来的标签取到跟stu中属性对应的值,赋值给stu中的属性
    [stu setValue:string forKey:_currentElement];
}


//4、结束标签解析
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
    //没有标签,解析结束
    _currentElement = nil;
}


//5、结束解析文档
- (void)parserDidEndDocument:(NSXMLParser *)parser{
    for (Student *stu in self.dataArray) {
        NSLog(@"%@",stu);
    }
}


//6、错误报告
- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError{
    NSLog(@"错误报告  %@",parseError);
}

2、XML_DOM解析

    在 Build Phases中 Link Binary With Libraries 添加 libxml2.tbd,同时Build Settings 中搜索 header search paths 添加/usr/include/libxml2    另外:Build Phases 中 Compile Sources找到第三方GDataXMLNode.m文件,右侧添加-fno-objc-arc

让其在ARC下运行

    ①引入第三方GDataXMLNode文件

    ②

//1、获取文件路径
    NSString *path = [[NSBundle mainBundle]pathForResource:@"XML" ofType:@"txt"];
    
    //2、以data类型进行解析,将文件读入到data中
    NSData *data = [NSData dataWithContentsOfFile:path];
    
    //3、创建GDataXMLDocument 对象,此时XML文档内的所有节点,以树的形式存在于GDataXMLDocument 对象中
    GDataXMLDocument *xmlDocument = [[GDataXMLDocument alloc]initWithData:data options:0 error:nil];
    
    //4、获取XML文档的根节点对象,根节点里包含了XML文档的所有内容
    GDataXMLElement *RootElement = [xmlDocument rootElement];
    
    //5、创建解析出来的学生数组
    self.dataArray = [NSMutableArray array];
    //遍历根节点<students>的所有子节点<student>
    for (GDataXMLElement *subElement in RootElement.children) {
        Student *stu= [Student new];
        //再遍历子节点<student>下的子标签<name><zi><say><weapon>取出子标签的内容,赋值给stu
        for (GDataXMLElement *contactElement in subElement.children) {
            
            /*
            //第一种赋值方法
            if ([contactElement.name isEqualToString:@"name"]) {
                stu.name = contactElement.stringValue;
            }else if([contactElement.name isEqualToString:@"zi"]){
                stu.zi = contactElement.stringValue;
            }else if ([contactElement.name isEqualToString:@"say"]){
                stu.say = contactElement.stringValue;
            }else if ([contactElement.name isEqualToString:@"weapon"]){
                stu.weapon = contactElement.stringValue;
            }
             */
            
            //使用KVC对stu整个赋值  第二种赋值方法
            [stu setValue:contactElement.stringValue forKeyPath:contactElement.name];
        }
        //将赋值后的model类放入数据源数组
        [self.dataArray addObject:stu];
    }
    for (Student *stu in self.dataArray) {
        NSLog(@"%@",stu);
    }

3、JSON-系统Foundation框架解析

    ①

NSString *path = [[NSBundle mainBundle]pathForResource:@"JSON" ofType:@"txt"];//路径
    NSData *data = [NSData dataWithContentsOfFile:path];//数据对象
    /**
     *  放入数据对象源(NSData对象)
     *
     *  @param NSJSONReadingOptions NSJSONReadingMutableContainers 表示解析完成后返回值类型为NSMutableArray
                                    NSJSONReadingMutableLeaves 表示解析完成后返回值类型是NSMutableString
                                    NSJSONReadingAllowFragments 允许JSON串最外层既不是数组也不是字典,但必须是JSON有效片段
     *
     *  @return 数组
     */
    NSArray *array = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
    self.dataArray = [NSMutableArray array];
    
    //遍历
    for (NSDictionary *dic in array) {
        //初始化model
        Student *stu = [Student new];
        [stu setValuesForKeysWithDictionary:dic];
        [self.dataArray addObject:stu];
    }
    for (Student *stu in self.dataArray) {
        NSLog(@"%@",stu);
    }

4、JSON-第三方Kit包解析    

    Build Phases 中 Compile Sources找到第三方JSONKit.m文件,右侧添加-fno-objc-arc

让其在ARC下运行

    ①引入第三方JSONKit包

    ②

//1、获取路径
    NSString *path = [[NSBundle mainBundle]pathForResource:@"JSON" ofType:@"txt"];
    //2、创建data对象
    NSData *data = [NSData dataWithContentsOfFile:path];
    //3、获取数据
    NSArray *array = [data objectFromJSONData];
    self.dataArray = [NSMutableArray array];
    for (NSDictionary *dic in array) {
        Student *stu = [Student new];
        [stu setValuesForKeysWithDictionary:dic];
        [self.dataArray addObject:stu];
    }
    for (Student *stu in self.dataArray) {
        NSLog(@"%@",stu);
    }

 

posted @ 2016-07-13 20:08  名门翘楚  阅读(194)  评论(0编辑  收藏  举报