zoukankan      html  css  js  c++  java
  • JSON XML 数据解析

    作为客户端,一般从后台传入的数据主要是两种 ,一种是JSON数据 一种是XML格式的数据  对于这两种数据  咱们都要一套自己的解析方法

    JSON:

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。 JSON 是出自于 JavaScript ,因此,JSON 的数据格式非常简单,您可以用 JSON 传输一个简单的 String,Number,Boolean,也可以传输一个数组,或者一个复杂的 Object 对象

    常见的两种格式:

    1. 这种对应着iOS中的键值对
    {
        "length" : "1",
        "url" : "http://127.0.0.1/resources/1",
        "image" : "http://127.0.0.1/resources/images/_01.png",
        "ID" : "01",
        "name" : "第一"
    },
    {
        "length" : "2",
        "url" : "http://127.0.0.1/resources/2",
        "image" : "http://127.0.0.1/resources/images/_02.png",
        "ID" : "02",
        "name" : "第2"
    }
    
    
    2.这种对应着数组
    [
    {
        "length" : "1",
        "url" : "http://127.0.0.1/resources/1",
        "image" : "http://127.0.0.1/resources/images/_01.png",
        "ID" : "01",
        "name" : "第一"
    },
    {
        "length" : "2",
        "url" : "http://127.0.0.1/resources/2",
        "image" : "http://127.0.0.1/resources/images/_02.png",
        "ID" : "02",
        "name" : "第2"
    }
    ]

    解析:

    1把JSON数据转换到OC能识别的数据 序列化
      id obj = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL] ;  
    
    2.将OC数据转换成JSON数据  反序列化
     NSData *data =[NSJSONSerialization dataWithJSONObject:arrM options:0 error:NULL];

    XML:

    XML(Extensible Markup Language ),可扩展标记语言,是一种简单的数据存储语言,使用一系列简单的标记描述数据,而这些标记可以用方便的方式建立

    常见的两种格式:

    1.  只有元素 和属性 没有元素内容的
    <?xml version="1.0" encoding="UTF-8"?>
    <citys>
        <city ID = "01" name = "北京 " length = "2" image = "http://127.0.0.1/resources/images/01.png" url = "http://127.0.0.1/resources/videos/01.mp4" />
    </citys>
    
    2.元素 和元素内容  没有元素属性
    <citys>
        <ciyt>
            <ID>01</ID>
            <image>http://127.0.0.1/resources/images/01.png</image>
            <length>2</length>
            <name>北京</name>
            <url>http://127.0.0.1/resources/videos/01.mp4</url>
        </city>
    </citys>

    解析:

    上述第一种解析方式:(控制器中:)
    
      // 创建XML解析器
            NSXMLParser *parser = [[NSXMLParser alloc]initWithData:data];
            
            // 设置代理  遵守协议
            
            parser.delegate = self;
            //开始解析/同步解析
            
            [parser parse];
         
    // 实现代理方法
    #pragma mark - XML解析器的代理方法
    // 开始解析文档时去调用
    - (void)parserDidStartDocument:(NSXMLParser *)parser{
        NSLog(@"开始解析文档");
    }
    
    // 开始解析元素的时候调用,attributes存储着元素的属性
    - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict{
        NSLog(@"开始解析元素%@,元素属性:%@",elementName,attributeDict);
        if ([elementName isEqualToString:@"city"]) {
            
            BFModel *model = [BFModel modelWithDict:attributeDict];
            [self.videosArrM addObject:model];
        }
    }
    
    // 发现元素内容的时候去调用
    - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
        
        NSLog(@"元素内容:%@",string);
        
        
    }
    
    // 元素解析后调用
    - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
        NSLog(@"%@元素解析完成",elementName);
    }
    
    // 文档解析结束后调用
    - (void)parserDidEndDocument:(NSXMLParser *)parser{
        NSLog(@"文档解析完成");
    }
    
    
    *****************************************************************
    
    上述第二种解析方式:
    
    // 定义两个全局变量
    
    @interface ViewController ()<NSXMLParserDelegate>
    
    @property (nonatomic,strong)NSMutableArray *videosArrM;
    
    @property (nonatomic,strong)BFModel *model;
    
    // 对应的当前的字符串的内容
    @property (nonatomic,strong)NSMutableString *curretStrM;
    
    @end
    
    
    
     // 创建XML解析器
            NSXMLParser *parser = [[NSXMLParser alloc]initWithData:data];
            
            // 设置代理  遵守协议
            
            parser.delegate = self;
            //开始解析/同步解析
            
            [parser parse];
    
    // 开始解析文档时去调用
    - (void)parserDidStartDocument:(NSXMLParser *)parser{
        NSLog(@"开始解析文档");
    }
    
    // 开始解析元素的时候调用,attributes存储着元素的属性
    - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict{
        NSLog(@"开始解析元素%@,元素属性:%@",elementName,attributeDict);
        if ([elementName isEqualToString:@"city"]) {
            
            self.model = [[BFModel alloc]init];
            [self.videosArrM addObject:self.model];
        }
        
    }
    
    // 发现元素的时候去调用
    - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
        
        NSLog(@"发现元素内容:%@",string);
        // 将字符串的内容替换
        [self.curretStrM setString:string];
    }
    
    // 元素解析后调用
    - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
        NSLog(@"%@元素解析完成",elementName);
        if ([elementName isEqualToString:@"ID"]) {
            [self.model setValue:self.curretStrM forKey:elementName];
        }else if ([elementName isEqualToString:@"image"]){
            [self.model setValue:self.curretStrM forKey:elementName];
        }else if ([elementName isEqualToString:@"length"]){
            [self.model setValue:self.curretStrM forKey:elementName];
        }else if ([elementName isEqualToString:@"url"]){
            [self.model setValue:self.curretStrM forKey:elementName];
        }else if ([elementName isEqualToString:@"name"]){
            [self.model setValue:self.curretStrM forKey:elementName];
        }
    }
    
    // 文档解析结束后调用
    - (void)parserDidEndDocument:(NSXMLParser *)parser{
        NSLog(@"文档解析完成");
    }
  • 相关阅读:
    k8s-存储-volume
    k8s-存储-configmap
    k8s-集群调度
    k8s-常用命令
    k8s-资源限制
    k8s-更改证书时间
    kubeadmin安装k8s
    CCPC-Wannafly Winter Camp Day7 D---二次函数【数论】【构造】
    洛谷P1219 八皇后【dfs】
    2019寒假计数器
  • 原文地址:https://www.cnblogs.com/zhubaofeng/p/5280228.html
Copyright © 2011-2022 走看看