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(@"文档解析完成");
    }
  • 相关阅读:
    Linux Core Dump
    ODP.NET Managed正式推出
    获取EditText的光标位置
    (Java实现) 洛谷 P1603 斯诺登的密码
    (Java实现) 洛谷 P1603 斯诺登的密码
    (Java实现) 洛谷 P1036 选数
    (Java实现) 洛谷 P1036 选数
    (Java实现) 洛谷 P1012 拼数
    (Java实现) 洛谷 P1012 拼数
    (Java实现) 洛谷 P1028 数的计算
  • 原文地址:https://www.cnblogs.com/zhubaofeng/p/5280228.html
Copyright © 2011-2022 走看看