zoukankan      html  css  js  c++  java
  • ios开发之网络访问的数据类型

      1> JSON

        特点:1、 [ ] 表示数组  {} 表示字典 - 对象模型建立关系

           2、 应用非常多,基本上移动开发的主要数据传输都是JSON

        要使用JSON,从网络上获取到数据data后,直接使用下面的方法进行反序列化

        // 用于将NSData类型数据反序列化为字典或者数组,具体转换类型取决于JSON最外面的括号是[]或者{}
        + (id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error;

      2> XML

        特点:传输量大,解析困难,使用较少

        // 根据从网络获取的数据data初始化一个解析器
        NSXMLParser *paser = [[NSXMLParser alloc] initWithData:data];
        
        // 设置代理
        paser.delegate = self;
        
        // 开始解析
        [paser parse];
    /*6个代理方法*/
    //
    1. 开始解析文档,在这里做初始化工作 - (void)parserDidStartDocument:(NSXMLParser *)parser // 2. 解析一个节点 - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict // 3. 查找节点内容,可能会多次 - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string // 4. 节点完成 - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName // 5. 解析完成,做收尾工作 - (void)parserDidEndDocument:(NSXMLParser *)parser // 6. 解析出错,清理中间数据 - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError

        小技巧:在可能的情况下,尽量将所有的属性设置到一个节点中的属性节点中,如此只需要第二步即可(第二步attributeDict会包含所有的属性键值对),避免了大量的拼接工作

     // 格式如下
     <book pages="12" index="1">
     <item id="1558" title="错入豪门" tag="都市言情" source="/upload/file/2013_07_4/2013718101155179.zip" author="唯一的迷蝶" updatetime="2013-6-21 11:06:17" summary="新婚之夜、她..." clicks="86945" words="" logo="/upload/pic/2013_06_5/20136211172503.png" jx="False" />
     </book>

      3> HTML

    通常用于自己没有服务器,或者某些网络资源确实非常重要!可以实现抓取以备不时之需。

        例如:省、市、地区、邮政编码、身份证的前6位归属

        要使用HTML可以利用正则表达式进行解析

     

    要使用正则表达式步骤

    1> 指定匹配方案

    * 打开网页源代码,找到需要抓取的部位

    * 将前后标记一起复制到代码中,然后用(.*?)替代我们需要抓到的内容即可

    * 匹配方案必须要能够和页面内容唯一匹配

    2> 实例化正则表达式,需要指定两个选项

    NSRegularExpressionCaseInsensitive          忽略大小写

    NSRegularExpressionDotMatchesLineSeparators .能够匹配换行

    3>

    * 使用firstMatchInString查找第一个与匹配方案相同的内容

    * 使用matchesInString可以查找多个与匹配方案相同的内容,

    通常用在

    <li></li>   html里面标示无符号的序列

    <ol></ol>   html里面标示数字的序列

    4> 根据resultrangeAtIndex方法,获取到要抓取的内容

    第一个括号对应的索引是1,第二个是2,依次类推

    5> 根据range,使用字符串的substringWithRange方法,可以获得准确的内容

    在正则表达式中,需要做出错处理,因为如果方案书写不正确,regex是不能被实例化的

    /*下面的代码简单的演示了抓取数据的过程*/

    1     NSString *pattern = @"<h3>基本释义</h3>(.*?)<h3>双解释义</h3>"; // pattern 是自定义的正则表达 ()里为我们想要截取的内容
    2     
    3     NSString *str = [html firstMatchWithPattern:pattern]; // html 是从网页获取的源代码html格式
     1 #pragma mark 根据正则表达式获取字符串
     2 - (NSString *)firstMatchWithPattern:(NSString *)pattern  // 自定义方法
     3 {
     4     
     5     NSError *error = nil;
     6     
     7     NSRegularExpression *regular = [[NSRegularExpression alloc] initWithPattern:pattern options:NSRegularExpressionCaseInsensitive | NSRegularExpressionDotMatchesLineSeparators error:&error];
     8     
     9     // 错误处理
    10     if (error) {
    11         
    12         NSLog(@"正则表达式出错%@", error.localizedDescription);
    13         
    14         return nil;
    15     }
    16     
    17     NSTextCheckingResult *result = [regular firstMatchInString:self options:NSMatchingReportCompletion range:NSMakeRange(0, self.length)];
    18     
    19     // 错误处理
    20     if (!result) {
    21         
    22         NSLog(@"没有找到合适的匹配项");
    23         
    24         return nil;
    25     }
    26     
    27     NSRange range = [result rangeAtIndex:1];
    28     
    29     return [self substringWithRange:range];
    30 }

      

  • 相关阅读:
    Text Link Ads 注册[赚钱一]
    Linux文件系统中的链接
    C++虚函数和纯虚函数(1)
    Android init reading tips
    Android上GDB的使用
    What is prelink?
    Linux fork哪些被继承,哪些不被继承
    为什么x86 Linux程序起始地址是从0x08048000开始的?
    Android应用开发的插件化 模块化
    C++拷贝构造函数(深拷贝、浅拷贝)
  • 原文地址:https://www.cnblogs.com/liufeng24/p/3504307.html
Copyright © 2011-2022 走看看