zoukankan      html  css  js  c++  java
  • 网络热恋之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 // 1. 开始解析某个元素,会遍历整个XML,识别元素节点名称
     2 
     3 - (void)parser:didStartElement:namespaceURI:qualifiedName:attributes:
     4 
     5 // 2. 文本节点,得到文本节点里存储的信息数据,对于大数据可能会接收多次!为了节约内存开销
     6 
     7 - (void)parser:foundCharacters:
     8 
     9 // 3. 结束某个节点,存储从parser:foundCharacters:方法中获取到的信息
    10 
    11 - (void)parser:didEndElement:namespaceURI:qualifiedName:
    12 
    13  注意:在解析过程中,上述三个方法会不停的重复执行,直到遍历完成为止
    14 
    15  // 4. 开始解析XML文档
    16 
    17 - (void)parserDidStartDocument:
    18 
    19 // 5. 解析XML文档结束
    20 
    21 - (void)parserDidEndDocument:
    22 
    23 // 6. 解析出错
    24 
    25 - (void)parser:parseErrorOccurred:

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

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

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

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

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

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

    具体实现代码:

    
    

    #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

     
  • 相关阅读:
    NSWindow,一些有的沒的
    IT单身男士必看【找女友单身程序员】
    Base 64 Encoding 编码
    如何成为一名优秀的C程序员
    iOS学习笔记—ObjectiveC 委托、非正式协议、正式协议
    程序员学习能力提升三要素
    工程师如何不被PM欺负
    最常被程序员们谎称读过的计算机书籍
    一些重要的算法
    asp调用.Net 托管代码
  • 原文地址:https://www.cnblogs.com/iOSlearner/p/5381342.html
Copyright © 2011-2022 走看看