IOS开发--云开发(云请求&&XML解析)

概要

本章主要简示了在IOS里面如何发出云请求,以及处理云端返回的数据,包括NSUrl等以及XML解析部分的知识。具体使用是一个查询IP的请求应用。

结果展示

(用了10几次不让用了)

流程概要

1.选取查询IP的云请求链接,并在浏览器里面试试效果,了解查询返回结果的格式

2.新建一个工程,拖拉一个UITextField和UIView,分别用作输入IP地址信息和查询结果展示

3.在发出云请求的时候,根据查询的IP构造查询的地址链接,然后使用NSURL生成链接,使用NSURLRequest构造请求,最后使用NSURLConnection发出请求

4.由于NSURLConnection是是一个异步请求,所以处理其返回结果需要使用其代理,首先指定它的代理,然后实现其代理里面的接收数据方法(connection:didReceiveData)和接收数据完成的方法(connectionDidFinishLoading)

5.在接收数据完成里面使用NSXMLParser解析返回的结果(有需要使用其代理),由于该类是使用SAX的方式解析,所以使用感觉比较烦

6.获取的查询格式如下所示:

<ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://WebXml.com.cn/">
<string>112.134.113.124</string>
<string>华中科技大学</string>
</ArrayOfString>

主要代码

h文件

//
//  ViewController.h
//  IPInfo
//
//  Created by God Lin on 14/12/11.
//  Copyright (c) 2014年 arbboter. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController
{
    IBOutlet UITextField* _textIP;
    IBOutlet UITextView* _textResult;

    NSString* _stringReciveData;
    NSMutableDictionary* _dictIP;
    NSMutableArray* _arrayIP;
    NSString* _currentContext;
}
@property (nonatomic, retain) UITextField* _textIP;
@property (nonatomic, retain) UITextView* _textResult;
@property (nonatomic, retain) NSString* _stringReciveData;
@property (nonatomic, retain) NSMutableDictionary* _dictIP;
@property (nonatomic, retain) NSMutableArray* _arrayIP;
@property (nonatomic, retain) NSString* _currentContext;

-(IBAction)go;

@end

m文件

//
//  ViewController.m
//  IPInfo
//
//  Created by God Lin on 14/12/11.
//  Copyright (c) 2014年 arbboter. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

@synthesize _textIP;
@synthesize _textResult;
@synthesize _stringReciveData;
@synthesize _arrayIP;
@synthesize _dictIP;
@synthesize _currentContext;

-(IBAction)go
{
    _stringReciveData = @"";
    [self._textIP resignFirstResponder];

    // 请求连接
    NSURL* url = [NSURL URLWithString:[NSString stringWithFormat:@"http://webservice.webxml.com.cn/WebServices/IpAddressSearchWebService.asmx/getCountryCityByIp?theIpAddress=%@",self._textIP.text]];
    NSURLRequest* request = [NSURLRequest requestWithURL:url];
    [NSURLConnection connectionWithRequest:request delegate:self];
}

#pragma NSURLConnectionDelegate协议
// 收到数据调用该方法,可能不是一次性收到所有数据,所以..
- (void)connection:(NSURLConnection *)connection
    didReceiveData:(NSData *)data
{
    NSString* str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

    if([self._stringReciveData length])
    {
        self._stringReciveData = [self._stringReciveData stringByAppendingString:str];
    }
    else
    {
        self._stringReciveData = str;
    }
    NSLog(@"%@",str);
}

// 数据接收完成调用该方法
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    NSXMLParser* xmlParser = [[NSXMLParser alloc] initWithData:[self._stringReciveData dataUsingEncoding:NSUTF8StringEncoding]];

    xmlParser.delegate = self;
    [xmlParser parse];
}

#pragma NSXMLParser协议
// 开始解析XML调用该方法
- (void)parserDidStartDocument:(NSXMLParser *)parser
{
    self._dictIP = [[NSMutableDictionary alloc] init];
}

// XML解析结束调用该方法
- (void)parserDidEndDocument:(NSXMLParser *)parse
{
    NSString* info = nil;
    static int n = 0;
    for (id ip in self._dictIP)
    {
        info = [NSString stringWithFormat:
                @"%-5d [%@, %@]\n", ++n, ip, [self._dictIP objectForKey:ip]];

        self._textResult.text = [self._textResult.text stringByAppendingString:info];
    }

    [self._dictIP removeAllObjects];
    self._textIP.text = @"";
}

// 解析XML遇到开始标签调用该方法
- (void)parser:(NSXMLParser *)parser
didStartElement:(NSString *)elementName
  namespaceURI:(NSString *)namespaceURI
 qualifiedName:(NSString *)qualifiedName
    attributes:(NSDictionary *)attributeDict
{
    if ([elementName isEqualToString:@"ArrayOfString"])
    {
        self._arrayIP = [[NSMutableArray alloc] init];
    }
    self._currentContext = @"";
}

// 解析XML遇到结束标签调用该方法
- (void)parser:(NSXMLParser *)parser
 didEndElement:(NSString *)elementName
  namespaceURI:(NSString *)namespaceURI
 qualifiedName:(NSString *)qName
{
    if([self._currentContext length] > 0)
    {
        [self._arrayIP addObject:self._currentContext];

    }

    if([self._arrayIP count] == 2)
    {
        [self._dictIP setObject:self._arrayIP[1] forKey:self._arrayIP[0]];
    }
}

// 解析XML遇到标签内容时调用该方法
// (有可能一个标签内容不止触发该函数一次)
- (void)parser:(NSXMLParser *)parser
foundCharacters:(NSString *)string
{
    // 去掉空格和换行
    string = [string stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceCharacterSet]];
    string = [string stringByReplacingOccurrencesOfString:@"\n" withString:@""];
    if([string length] > 0)
    {
        self._currentContext = [self._currentContext stringByAppendingString:string];
    }
}
- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    self._textResult.editable = NO;
    self._textResult.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"bg.jpg"]];
    self._textResult.textColor = [UIColor yellowColor];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

工程代码

时间: 2024-10-13 01:12:41

IOS开发--云开发(云请求&&XML解析)的相关文章

网络之XML解析-GData

GDataXML是一套Google使用Objective-C开发的DOM方式XML解析类库,支持读取和修改XML文档,支持XPath方式查询, GDataXML 是 iOS 下的一款轻量级 XML 解析器.它与C#的XmlDocument类似. 一.GData配置 1.将类引入项目中,添加libxml2.dylib 2.在Build Phases的Compile Sources中找到GDataXMLNode.m添加-fno-objc-arc 3.进入Build Settings,搜索Header

IOS 网络浅析-(七 JSON解析之三方JSONKit)

在这个网络横行的时代......... 有没有小说的感觉,哈哈??. 言归正传,之前我写过XML的网络解析,但是现在的app开发很少有用到XML解析的了,主流的则是JSON.(有时间我会对其进行总结)三方更是让json解析更加简便,由于代码过于简单,请大家做好心理准备.不要被吓到哦. // // ViewController.m // CX-JSON解析(三方JSONKit-master) // // Created by ma c on 16/3/18. // Copyright © 2016

iOS网络编程开发—JSON和XML数据解析

iOS网络编程开发—JSON解析 一.什么是JSON JSON是一种轻量级的数据格式,一般用于数据交互 服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外) JSON的格式很像OC中的字典和数组 {"name" : "jack", "age" : 10} {"names" : ["jack", "rose", "jim"]} 标准JSON格式的

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

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

iOS开发之网络数据解析(二)--XML解析简介

前言:本篇随笔介绍的是XML解析. 正文: 1.XML解析方式有2两种: DOM:一次性将整个XML数据加载进内存进行解析,比较适合解析小文件 SAX:从根元素开始,按顺序一个元素一个元素往下解析,比较适合解析大文件 2.IOS中XML解析方案有很多种: 2-1.第三方框架: libxml2:纯C语言,默认包含在iOS SDK中,同时支持DOM和SAX解析 GDataXML:DOM方式解析,由Google开发,基于libxml2 2-2.苹果原生 NSXMLParser:SAX方式解析,使用简单

小程序云开发调用HTTP请求中got第三方库使用失败解决方法

小程序云开发调用HTTP请求中got第三方库使用失败解决方法 错误代码 {"errorCode":1,"errorMessage":"user code exception caught","stackTrace":"The \"original\" argument must be of type function"} 替换方案 // 云函数入口文件 const cloud = req

iOS开发XML解析

xml解析主要可以使用CData,libxml2以及NSXMLParser,以下对各个方法给出了相应的例子: 1.CDataXML: 1.1.创建FKBook类 #import <Foundation/Foundation.h> @interface FKBook : NSObject @property (nonatomic , assign) NSInteger bookID; @property (nonatomic , copy) NSString *title; @property

iOS开发:xmpp下的xml数据解析及修改上传

一.利用xmpp里的扩展文件进行xml数据解析,xml数据解析的框架需要自己手动写出. 包含这个头文件NSXMLElement+XMPP.m.主要使用了这个文件中的如下方法: - (NSXMLElement *)elementForName:(NSString *)name { NSArray *elements = [self elementsForName:name]; if ([elements count] > 0) { return [elements objectAtIndex:0]

小程序云开发之新闻类项目分析

应该每一个前端开发者都有一颗全干全栈的心??吧. 那就让云开发满足你 云开发一出来就开始玩,云数据库,云函数,全栈的体验和开发速度,真的不是一般的爽. 接下来工作中要开发一款新闻类小程序,于是就开始了对头条君的调研,此篇文章,是我的个人总结和分析,欢迎大佬拍砖. 一. 准备 小程序云开发必须有小程序AppId才能使用,所以首先应先注册一个小程序账号(如果已有请忽略).设置->开发设置中的小程序AppId 开发工具:编辑器-vscode, 微信开发者工具 辅助工具: Markman:图标标注工具,