zoukankan      html  css  js  c++  java
  • IOS 网络浅析-(五 xml解析)

    XML

    1. 可扩展标记语言
    2. 用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言
    3. 易读性高,编码手写难度小,数据量大

    NSXMLParser解析方法

    我们所用到的NSXMLParser是采用SAX方法解析

    SAX(Simple API for XML)

    • 只能读,不能修改,只能顺序访问,适合解析大型XML,解析速度快
    • 常应用于处理大量数据的XML,实现异构系统的数据访问,实现跨平台
    • 从文档的开始通过每一节点移动,定位一个特定的节点

    DOM(Document Object Model)

    • 不仅能读,还能修改,而且能够实现随机访问,缺点是解析速度慢,适合解析小型文档
    • 一般应用与小型的配置XML,方便操作
    • 为载入到内存的文档节点建立类型描述,呈现可横向移动、潜在巨大的树型结构
    • 在内存中生成节点树操作代价昂贵

    xmlParser解析过程

    NSXMLParser解析过程

    1.创建NSXMLParser实例,并传入从服务器接收的XML数据

    2.定义解析器代理

    3.解析器解析

    4.通过解析代理方法完成XML数据的解析

    使用XML解析文档时使用协议<NSXMLParserDelegate>,实现它的代理方法 

    // 1. 开始解析某个元素,会遍历整个XML,识别元素节点名称
    
    - (void)parser:didStartElement:namespaceURI:qualifiedName:attributes:
    
    // 2. 文本节点,得到文本节点里存储的信息数据,对于大数据可能会接收多次!为了节约内存开销
    
    - (void)parser:foundCharacters:
    
    // 3. 结束某个节点,存储从parser:foundCharacters:方法中获取到的信息
    
    - (void)parser:didEndElement:namespaceURI:qualifiedName:
    
     注意:在解析过程中,上述三个方法会不停的重复执行,直到遍历完成为止
    
     // 4. 开始解析XML文档
    
    - (void)parserDidStartDocument:
    
    // 5. 解析XML文档结束
    
    - (void)parserDidEndDocument:
    
    // 6. 解析出错
    
    - (void)parser:parseErrorOccurred:

    在XMLParser解析过程中,还需要实现NSXMLParserDelegate代理方法

    如果一个XML文件中包含多个对象在解析过程中,为了能够正确解析中文档中的数据,需要注意一下几点:

    1.当前解析出得是对象还是元素值?

    如果是对象,需要判断当前对象时第几个,是第一个对象,还是第二、第三……,如果是第N个,需要将第N-1的对象值取出保存。

    如果是元素值,需要将解析出得数据,赋值给对应于对象的某个属性。

    2.在解析过程中,每次读取的是一个字符,所有必须实现字符串的拼接过程,将解析出字符进行组合。用来判断当前解析出得是对象,还是元素名。或元素值。

     代码来啦———

    //
    //  ViewController.m
    //  CX-XML解析
    //
    //  Created by ma c on 16/3/18.
    //  Copyright © 2016年 xubaoaichiyu. All rights reserved.
    //
    
    #import "ViewController.h"
    
    @interface ViewController ()<NSXMLParserDelegate>
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        NSURL * url = [NSURL URLWithString:@"http://192.168.1.200/train.xml"];
        
        NSURLRequest * request = [NSURLRequest requestWithURL:url];
        
        [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
           
            //xml解析
            
            NSXMLParser * parse = [[NSXMLParser alloc]initWithData:data];
            
            parse.delegate = self;
            
            [parse parse];
            
        }];
        
    }
    //打开文档
    -(void)parserDidStartDocument:(NSXMLParser *)parser{
        
        NSLog(@"打开文档,开始解析");
        
    }
    //开始查找起始标签
    -(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict{
        
        NSLog(@"开始元素:%@",elementName);
        NSLog(@"属性%@",attributeDict);
        
    }
    //获取标签内容
    -(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(@"解析完成");
        
    }
    
    /*
     结果过长,截取部分。
     2016-03-18 10:25:21.734 CX-XML解析[4043:238219] 打开文档,开始解析
     2016-03-18 10:25:21.735 CX-XML解析[4043:238219] 开始元素:dataSet
     2016-03-18 10:25:21.736 CX-XML解析[4043:238219] 属性{
     xmlns = "http://WebXml.com.cn/";
     }
     2016-03-18 10:25:21.736 CX-XML解析[4043:238219] 获取内容:
     
     2016-03-18 10:25:21.736 CX-XML解析[4043:238219] 开始元素:diffgr:diffgram
     2016-03-18 10:25:21.737 CX-XML解析[4043:238219] 属性{
     "xmlns:diffgr" = "urn:schemas-microsoft-com:xml-diffgram-v1";
     "xmlns:msdata" = "urn:schemas-microsoft-com:xml-msdata";
     }
     2016-03-18 10:25:21.737 CX-XML解析[4043:238219] 获取内容:
     
     2016-03-18 10:25:22.074 CX-XML解析[4043:238219] 结束标签:diffgr:diffgram
     2016-03-18 10:25:22.074 CX-XML解析[4043:238219] 获取内容:
     2016-03-18 10:25:22.074 CX-XML解析[4043:238219] 结束标签:dataSet
    
     2016-03-18 10:25:22.074 CX-XML解析[4043:238219] 解析完成
    
     */
    
    @end
  • 相关阅读:
    陈欧代言
    location传值
    jsp中button传值
    电影
    排序
    比较两个字符,相等输出yes,不相等输出no
    查表求平方值
    数据库查询调优(SQL 2008)
    HelloWorld
    关于缓存 (这个自己也在慢慢学习,慢慢总结中,有路过的,求指点,赶紧不尽。。。)
  • 原文地址:https://www.cnblogs.com/xubaoaichiyu/p/5291132.html
Copyright © 2011-2022 走看看