iOS 网络数据之XML解析

<pre name="code" class="objc"><span style="font-family:Arial, Helvetica, sans-serif;"><span style="font-size:14px;"><span style="background-color: rgb(255, 255, 255);"></span></span></span><address><span style="font-size:14px;">
</span></address>

向服务器请求数据,那么数据必须以某个特定的格式存放,然后一方把数据按这种格式组织起来,另一方按相同的方式把数据解析数来,就像是我们人之间讲话交流,我们的话会转变成振动、在空气中传播、然后对方的耳朵感受这种振动,然后把振动转化为话,所以我认为格式的组织是为了更好的传递数据。一般网络数据会封装成两种格式进行传递:XML和json。

1、”解析“:

XML长得和HTML很像,打开浏览器的显示源码功能,可以看到一串串的<>标签,而解析XML也依靠于这些标签。首先说下我理解的“解析”,不管是XML还是json,实际就是一大段字符串,解析就是按XML或json的格式规范把这个字符串变成字典或数组,这样才能自由的获取里面的数据。比如:

<span style="font-size:14px;"><weather>晴转多云</weather>
<wind>微风</wind>
<temperature>34 ~ 23℃</temperature></span>

weather标签里面是”晴转多云“,就是说天气是晴转多云,那么这就是字典里面的一个键值对,weather是键,晴转多云是值。XML、json和数组字典都是组织数据的东西,“解析”就是把数据从某种组织格式转为另一种。

2、DOM和SAX:

这是XML的两种解析方式,DOM是把XML文档整个的加载,对于这个文档里数据的结构都清楚了;然后可以使用XPath直接获取某个节点;而SAX是从XML头部逐条逐个标签的向下读,遇到一个什么东西就通知一下,所以它不需要XML文档已经全部获取,但是它只管得了当前读到的地方,前面读过的就取不到了,所以在结构上不是很清楚,但是相对快速、耗内存小。个人觉得DOM解析操作起来更方便一些。

3、关于解析类库的选择:

参看文章:iOS平台XML解析类库对比概述

4、系统的NSXMLParser的使用:

XML数据选择使用百度天气接口的数据,地址:http://api.map.baidu.com/telematics/v3/weather?location=%E5%8C%97%E4%BA%AC&ak=5slgyqGDENN7Sy7pw29IUvrZ 。关于天气接口的配置,可以参考:百度天气接口

(1)获取数据:

<span style="font-size:14px;">-(void )getXMLData{
    NSString * URLStr = @"http://api.map.baidu.com/telematics/v3/weather?location=%E5%8C%97%E4%BA%AC&ak=5slgyqGDENN7Sy7pw29IUvrZ";
    NSURL * url = [NSURL URLWithString:URLStr];
    NSURLRequest * request = [[NSURLRequest alloc]initWithURL:url];
    _XMLData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

}</span>

(2)构建NSXMLParser:

<span style="font-size:14px;">-(void )parserXMLData{
    _parser = [[NSXMLParser alloc]initWithData:_XMLData];
    _parser.delegate = self;
    if (![_parser parse]) {
        NSLog(@"Parser start error");
    }
}
</span>

这里是使用NSData对象构建,也可以使用文档资源地址构建- (id)initWithData:(NSData
*)data、使用输入流构建:- (id)initWithStream:(NSInputStream
*)stream。调用parse开启解析。需要设置委托对象,这样在解析到某个元素变迁或是字符的时候,会让委托对象调用委托方法,而就是在这些方法里面进行数据的处理。

(3)委托方法:

<span style="font-size:14px;">-(void )parserDidStartDocument:(NSXMLParser *)parser{  //开始解析文档是调用
    NSLog(@"doucment start");
}

-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{  //每次解析到一个标签的时候调用,例如上面<span style="font-family: Arial, Helvetica, sans-serif;"><weather>晴转多云</weather>中的</span><span style="font-family: Arial, Helvetica, sans-serif;"><weather>标签</span>
    _currentElement = elementName; //把当前的标签保存下来,便于下面方法里判断
    if ([_currentElement isEqualToString:@"weather_data"]) { //当开始解析<span style="font-family: Arial, Helvetica, sans-serif;">weather_data这个标签的时候构建数组,用于保存多天的天气信息。</span>
        _weatherArray = [[NSMutableArray alloc]init];
    }else if ([_currentElement isEqualToString:@"date"]&&_weatherArray){//因为date标签是每一天天气信息的开始变迁,所以在解析到date标签的时候构建一个字典,用来保存某一天的天气信息,并且加入到<span style="font-family: Arial, Helvetica, sans-serif;">_weatherArray里面</span>
        NSMutableDictionary * oneDayWeather = [[NSMutableDictionary alloc]init];
        [_weatherArray addObject:oneDayWeather];
    }
}

-(void )parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{ //每次解析到一个字符串,在XML文档里,除了标签,就是数据,而数据有些数字符串,所以字符串数据时会调用这个方法,例如上面的<span style="font-family: Arial, Helvetica, sans-serif;"><weather>晴转多云</weather>中的晴转多云。</span>
    string = [string stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@" \n\r"]]; //通过这个方法去掉空格、换行字符串,保证把有用的字符串存进来
    if (_weatherArray&&string.length>0) {
        if ([_currentElement isEqualToString:@"date"]) { //使用<span style="font-family: Arial, Helvetica, sans-serif;">_currentElement的值来判断当前是处于哪一个标签内部</span>
            NSMutableDictionary * oneDayWeather = _weatherArray.lastObject; //因为SAX解析从上到下,所以lastObject就是最新的一个字典,也就是当前需要存入数据的字典
            [oneDayWeather setObject:string forKey:@"date"];
        }else if ([_currentElement isEqualToString:@"dayPictureUrl"]){
            NSMutableDictionary * oneDayWeather = _weatherArray.lastObject;
            [oneDayWeather setObject:string forKey:@"dayPictureUrl"];
        }else if ([_currentElement isEqualToString:@"nightPictureUrl"]){
            NSMutableDictionary * oneDayWeather = _weatherArray.lastObject;
            [oneDayWeather setObject:string forKey:@"nightPictureUrl"];
        }else if ([_currentElement isEqualToString:@"weather"]){
            NSMutableDictionary * oneDayWeather = _weatherArray.lastObject;
            [oneDayWeather setObject:string forKey:@"weather"];
        }else if ([_currentElement isEqualToString:@"wind"]){
            NSMutableDictionary * oneDayWeather = _weatherArray.lastObject;
            [oneDayWeather setObject:string forKey:@"wind"];
        }else if ([_currentElement isEqualToString:@"temperature"]){
            NSMutableDictionary * oneDayWeather = _weatherArray.lastObject;
            [oneDayWeather setObject:string forKey:@"temperature"];
        }
    }
}

-(void )parser:(NSXMLParser *)parser foundCDATA:(NSData *)CDATABlock{ //和上面的字符串类似,有些数据不是字符串,而是字节,这里就是NSData对象
    NSLog(@"%@",[[NSString alloc]initWithData:CDATABlock encoding:NSUTF8StringEncoding]);
}

-(void )parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{ // 当解析到一个标签的结束的时候调用,每一个标签都是开头、结尾两个成对存在的,例如<span style="font-family: Arial, Helvetica, sans-serif;"><weather>晴转多云</weather>中的<weather>和</weather>,当解析到</weather>的时候就是一个标签的结束,也就会调用这个方法。</span>
    //NSLog(@" elementName : %@ , namespaceURI : %@ , qualifiedName : %@ ",elementName,namespaceURI,qName);

}

-(void )parserDidEndDocument:(NSXMLParser *)parser{  //这是文档整个解析完毕的时候调用
    NSLog(@"document end");

    NSLog(@"%@",_weatherArray);
}
</span>

上面列举了一些解析过程中调用的委托方法,还有许多其他方法,参考文档中NSXMLParserDelegate。似乎方法很详细,把解析过程的每个细节的考虑到了,但是感觉把XML中的数据合理的存放到数组字典里,真不是件容易的事,不想json,一句话就搞定了。SAX解析最大的不便是,当解析到某个标签的时候,你不知道它上一层的标签是什么,更不知道上上层的标签是什么,也就是说没有东西能告诉你整个文档的结构是什么样的。上面的例子是将链接中获得的天气XML文档中天气的部分取出来放进数组_weatherArray里面,也就是<weather_data>...</weather_data>这个标签内的内容。

SAX解析总的来说,不是很方便,如果数据的层次结构比较复杂,处理起来会很麻烦,所以要考虑DOM解析和json格式。

iOS 网络数据之XML解析

时间: 2024-12-16 17:16:58

iOS 网络数据之XML解析的相关文章

网络数据的XML解析

XML解析一般分两种模式SAX和DOM,事件和文档. 一:XML解析之SAX解析,以及对NSXMLParser的应用. sax解析说白了,就是一个事物模型解析,从头开始读取文档然后根据读取到的头标签标签时要怎么处理,读完头标签后,理论上是读取标签值了, 然后读取后遇到结束标签等 简单举个例子 <rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc

iOS网络数据解析

iOS开发过程中,网络数据的传输过程一般是:客户端发送请求给服务器,服务器接收到客户端发送的网络请求后返回相应的数据.此时客户端需要把服务器返回的数据转化为前段和移动端开发中使用的数据格式(如OC/java).后台服务器一般使用php.java..net进行开发,而前段和移动端使用的一般是OC/JAVA/HTML/CSS/JS,做好前后端的数据交互极为重要,如今数据交互常用的就是JSON和XML.下面就iOS开发过程中的JSON解析和XML解析进行简单的说明. 一.JSON解析 JSON是一种轻

ios网络学习------8 xml格式数据的请求处理 用代码块封装

#pragma mark 加载xml - (void)loadXML { //获取网络数据. NSLog(@"load xml"); //从web服务器加载数据 NSString *str = @"http://www.baidu.com?format=xml"; //这里是乱写的 //1简历NSURL NSURL *url = [NSURL URLWithString:str]; //2建立NSURLRequest NSURLRequest *request =

iOS网络数据下载和JSON解析

iOS网络数据下载和JSON解析 简介 在本文中笔者将要给大家介绍iOS中如何利用NSURLConnection如何从网络中下载数据,如何解析下载下来的JSON数据格式,以及如何显示数据和图片的异步下载显示. 涉及到的知识点: 1.NSURLConnection异步下载和封装 #import "ZJHttpRequest.h" //消除performSelector的警告 #pragma clang diagnostic ignored "-Warc-performSelec

ios网络学习------7 xml格式数据的请求处理

用NSXMLParser解析XML文件过程: 1 创建NSXMLParser实例,并传入从服务器接收XML数据. 2 定义解析器代理 3 解析器解析. 4 通过解析代理方法完成XML数据的解析. #pragma mark 加载xml - (void)loadXML { //获取网络数据. NSLog(@"load xml"); //从web服务器加载数据 NSString *str = @"http://www.baidu.com?format=xml"; //这里

ios 网络数据下载和JSON解析

ios 网络数据下载和JSON解析 简介 在本文中笔者将要给大家介绍ios中如何利用NSURLConnection从网络上下载数据,如何解析下载下来的JSON数据格式,以及如何显示数据和图片的异步下载显示 涉及到得知识: 1.NSURLConnection异步下载和封装 2.JSON格式和JSON格式解析 3.数据显示和使用SDWebImage异步显示图片 内容 1.网络下载基础知识介绍 (1)什么是网络应用? 一般情况下, iPhone的计算机, 照相机不需要从网络上下载数据也能运行, 所以这

iOS网络数据解析之XML解析-GDataXML

GDataXML 第三方xml解析框架 DOM解析:一次性将整个XML文档加载进内存,比较适合解析小文件 GDataXML中常用的类 GDataXMLDocument: 代表整个XML文档 GDataXMLElement: 代表文档中的每个元素 使用attributeForName:方法可以获得属性值 要使用GDataXML,先要对项目进行一些配置.1>导入libxml2动态库targets--Build Phases--link Binary With Libraries 2>设置libxm

iOS网络编程开发—JSON解析与XML解析

一.什么是JSON JSON是一种轻量级的数据格式,一般用于数据交互 服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外) JSON的格式很像OC中的字典和数组 {"name" : "jack", "age" : 10} {"names" : ["jack", "rose", "jim"]} 标准JSON格式的注意点:key必须用双引号 要想从

Android官方开发文档Training系列课程中文版:网络操作之XML解析

原文地址:http://android.xsoftlab.net/training/basics/network-ops/xml.html 扩展标记语言(XML)是一系列有序编码的文档.它是一种很受欢迎的互联网数据传输格式.像需要频繁更新内容的网站来说,比如新闻站点或者博客,需要经常更新它们的XML源,以使外部程序可以保持内容的同步变化.对于含有网络连接态的APP应用来说,上传及解析XML数据是一个通用的任务.这节课将会学习如何解析XML文档及如何使用XML中的数据. 选择解析器 我们推荐使用X