zoukankan      html  css  js  c++  java
  • (转)解析json xml

    JSON数据

    [plain] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. {"videos":[{"id":1,"image":"resources/images/minion_01.png","length":10,"name":"小黄人 第01部","url":"resources/videos/minion_01.mp4"},{"id":2,"image":"resources/images/minion_02.png","length":12,"name":"小黄人 第02部","url":"resources/videos/minion_02.mp4"},{"id":3,"image":"resources/images/minion_03.png","length":14,"name":"小黄人 第03部","url":"resources/videos/minion_03.mp4"},{"id":4,"image":"resources/images/minion_04.png","length":16,"name":"小黄人 第04部","url":"resources/videos/minion_04.mp4"},{"id":5,"image":"resources/images/minion_05.png","length":18,"name":"小黄人 第05部","url":"resources/videos/minion_05.mp4"},{"id":6,"image":"resources/images/minion_06.png","length":20,"name":"小黄人 第06部","url":"resources/videos/minion_06.mp4"},{"id":7,"image":"resources/images/minion_07.png","length":22,"name":"小黄人 第07部","url":"resources/videos/minion_07.mp4"},{"id":8,"image":"resources/images/minion_08.png","length":24,"name":"小黄人 第08部","url":"resources/videos/minion_08.mp4"},{"id":9,"image":"resources/images/minion_09.png","length":26,"name":"小黄人 第09部","url":"resources/videos/minion_09.mp4"},{"id":10,"image":"resources/images/minion_10.png","length":28,"name":"小黄人 第10部","url":"resources/videos/minion_10.mp4"},{"id":11,"image":"resources/images/minion_11.png","length":30,"name":"小黄人 第11部","url":"resources/videos/minion_11.mp4"},{"id":12,"image":"resources/images/minion_12.png","length":32,"name":"小黄人 第12部","url":"resources/videos/minion_12.mp4"},{"id":13,"image":"resources/images/minion_13.png","length":34,"name":"小黄人 第13部","url":"resources/videos/minion_13.mp4"},{"id":14,"image":"resources/images/minion_14.png","length":36,"name":"小黄人 第14部","url":"resources/videos/minion_14.mp4"},{"id":15,"image":"resources/images/minion_15.png","length":38,"name":"小黄人 第15部","url":"resources/videos/minion_15.mp4"},{"id":16,"image":"resources/images/minion_16.png","length":40,"name":"小黄人 第16部","url":"resources/videos/minion_16.mp4"}]}  


    JSON–OC 转换对照表

    JSON

    OC

    大括号 { }

    NSDictionary

    中括号 [ ]

    NSArray

    双引号 ""

    NSString

    数字 10、10.8

    NSNumber

     在iOS中,JSON的常见解析方案有4种
     第三方框架:JSONKit、SBJson、TouchJSON(性能从左到右,越差)
     苹果原生(自带):NSJSONSerialization(性能最好)

    1.苹果原生

    NSJSONSerialization的常见方法
     
    JSON数据 --> OC对象

    + (id)JSONObjectWithData:(NSData*)data options:(NSJSONReadingOptions)opterror:(NSError**)error;

    [objc] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. // data 是获取到的json数据  
    2. - (NSArray *)parseJSONData:(NSData *)data  
    3. {  
    4.     // 解析数据 (使用NSJSONSerialization 系统原生json解析类)  
    5.     NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];  
    6.     NSArray *array = dict[@"videos"];  
    7.       
    8.     NSMutableArray *videos = [NSMutableArray array];  
    9.     for (NSDictionary *videoDict in array) {  
    10.         HMVideo *video = [HMVideo videoWithDict:videoDict];  
    11.         [videos addObject:video];  
    12.     }  
    13.     return videos;  
    14. }  




    OC对象 --> JSON数据

    + (NSData *)dataWithJSONObject:(id)objoptions:(NSJSONWritingOptions)opterror:(NSError**)error;

    XML(ExtensibleMarkupLanguage,译作“可扩展标记语言”)

    [plain] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. <videos>  
    2.     <video name="小黄人 第01部" length="30" />  
    3.     <video name="小黄人 第02部" length="19" />  
    4.     <video name="小黄人 第03部" length="33" />  
    5. </videos>  
    XML的解析方式有2种
    DOM:一次性将整个XML文档加载进内存,比较适合解析小文件
    SAX:从根元素开始,按顺序一个元素一个元素往下解析,比较适合解析大文件
    iOS中,解析XML的手段有很多
    苹果原生
    NSXMLParser:SAX方式解析,使用简单
     
    第三方框架
    libxml2:纯C语言,默认包含在iOSSDK中,同时支持DOM和SAX方式解析
    GDataXML:DOM方式解析,由Google开发,基于libxml2
    XML解析方式的选择建议
    大文件:NSXMLParser、libxml2
    p小文件:GDataXML

    1.DOM (GDataXML 苹果自带)方式解析

    一次性将整个XML文档加载进内存,比较适合解析小文件

    GDataXML配置

    GDataXML基于libxml2库,得做以下配置
    导入libxml2库
     
     
     
    设置libxml2的头文件搜索路径(为了能找到libxml2库的所有头文件)
    在Head SearchPath中加入/usr/include/libxml2
    设置链接参数(自动链接libxml2库)
    在OtherLinkerFlags中加入-lxml2
     
    由于GDataXML是非ARC的,因此得设置编译参数
     

    GDataXML使用

    GDataXML中常用的类
    GDataXMLDocument:代表整个XML文档
     
    GDataXMLElement
    代表文档中的每个元素
    使用attributeForName:方法可以获得属性值

    例如:

    [objc] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. // data 是获取到的xml数据  
    2. - (NSArray *)DOMparseXMLWithData:(NSData *)data  
    3. {  
    4.     // 1.加载文档  
    5.     GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil];  
    6.       
    7.     // 2.获得根元素  
    8.     GDataXMLElement *root = doc.rootElement;  
    9.       
    10.     // 3.获得所有video元素  
    11.     NSArray *elements = [root elementsForName:@"video"];  
    12.       
    13.     // 4.将GDataXMLElement对象转成HMVideo模型  
    14.     NSMutableArray *videos = [NSMutableArray array];  
    15.     for (GDataXMLElement *ele in elements) {  
    16.         HMVideo *video = [[HMVideo alloc] init];  
    17.         video.ID = [ele attributeForName:@"id"].stringValue.intValue;  
    18.         video.length = [ele attributeForName:@"length"].stringValue.intValue;  
    19.         video.name = [ele attributeForName:@"name"].stringValue;  
    20.         video.image = [ele attributeForName:@"image"].stringValue;  
    21.         video.url = [ele attributeForName:@"url"].stringValue;  
    22.         [videos addObject:video];  
    23.     }  
    24.     return videos;  
    25. }  



    2.SAX(NSXMLParser 苹果自带 需要使用代理

    <NSXMLParserDelegate>

    从根元素开始,按顺序一个元素一个元素往下解析,比较适合解析大文件

    [objc] view plaincopy在CODE上查看代码片派生到我的代码片
     
      1. // data 是获取到的xml数据  
      2. - (NSArray *)SAXparseXMLWithData:(NSData *)data  
      3. {  
      4.     // 1.创建解析器  
      5.     NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];  
      6.       
      7.     // 2.设置代理  
      8.     parser.delegate = self;  
      9.       
      10.     // 3.开始解析  
      11.     [parser parse]; // 卡住(解析完毕才会返回)  
      12.       
      13.     return self.videos;  
      14. }  
      15.   
      16. #pragma mark - NSXMLParserDelegate  
      17. /** 
      18.  *  开始解析文档时调用 
      19.  */  
      20. - (void)parserDidStartDocument:(NSXMLParser *)parser  
      21. {  
      22.     //    NSLog(@"parserDidStartDocument----");  
      23. }  
      24. /** 
      25.  *  结束解析文档时调用(解析完毕) 
      26.  */  
      27. - (void)parserDidEndDocument:(NSXMLParser *)parser  
      28. {  
      29.     //    NSLog(@"parserDidEndDocument----");  
      30. }  
      31.   
      32. /** 
      33.  *  解析到一个元素的开头时调用 <videos> 
      34.  */  
      35. - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict  
      36. {  
      37.     //    NSLog(@"didStartElement----%@", elementName);  
      38.     if ([@"videos" isEqualToString:elementName]) { // 解析到一个videos标签  
      39.         self.videos = [NSMutableArray array];  
      40.     } else if ([@"video" isEqualToString:elementName]) { // 解析到一个video标签, 创建一个模型  
      41.         HMVideo *video = [HMVideo videoWithDict:attributeDict];  
      42.         [self.videos addObject:video];  
      43.     }  
      44. }  
      45.   
      46. /** 
      47.  *  解析到一个元素的结尾时调用 </videos> 
      48.  */  
      49. - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName  
      50. {  
      51.     //    NSLog(@"didEndElement----%@", elementName);  
      52. }  

    链接地址:http://blog.csdn.net/dwt1220/article/details/45222119

  • 相关阅读:
    lombok 异常:Lombok needs a default constructor in the base class less... (Ctrl+F1) Inspe
    kinaba 安装踩坑: FATAL Error: [elasticsearch.url]: definition for this key is missing
    使用Java将搜狗词库文件(文件后缀为.scel)转为.txt文件
    RedHat linux服务器安装elasticsearch且设置公网访问
    return array 评论添加状态和提示信息
    .保护Express应用程序
    SQL Injection(SQL注入漏洞)
    POST在发送数据的时候使用的是HTTP命令
    assert_option()可以用来对assert()进行一些约束和控制
    supercool.sh文件里,有哪些恶意的命令
  • 原文地址:https://www.cnblogs.com/lizhitai/p/4517302.html
Copyright © 2011-2022 走看看