iPhone开发【十九】XML解析之NSXMLParser(使用Web Services查询火车信息)

NSXMLParser Demo 一个使用ios自带的NSXMLParser的demo,课供新手参考学习 立即下载

转载请注明出处,原文网址:http://blog.youkuaiyun.com/m_changgong/article/details/8246333 作者:张燕广

实现的功能:1)根据火车车次查询火车信息;2)演示XML解析类NSXMLParser的应用。

关键词:NSXMLParser XML解析

1、新建一个Sigle View Application,命名为Train,工程结构如下:


2、修改ViewController.xib,添加一个TextField控件和一个Button。

3、修改ViewController.h,如下:

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController<NSXMLParserDelegate, NSURLConnectionDelegate> {
    bool elementFound;
    uint count;
}

@property(strong,nonatomic)NSURLConnection *conn;
@property(strong,nonatomic)NSString *soapMessage;
@property(strong,nonatomic)NSXMLParser *xmlParser;
@property(strong,nonatomic)NSMutableData *responseData;
@property(strong,nonatomic)NSMutableString *queryResult;
@property(strong,nonatomic)NSString *trainId;
@property(strong,nonatomic)NSString *destElement;

@property(strong,nonatomic)IBOutlet UITextField *inputTrainInfo;
-(IBAction)queryByTarinID:(id)sender;
@end
连接输出口in putTrainInfo及操作queryByTrainId,如下:


4、修改ViewController.m,如下:

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController
@synthesize conn;
@synthesize soapMessage;
@synthesize xmlParser;
@synthesize responseData;
@synthesize trainId;
@synthesize destElement;
@synthesize queryResult;
@synthesize inputTrainInfo;
- (void)viewDidLoad
{
    [super viewDidLoad];
	// Do any additional setup after loading the view, typically from a nib.
    //解析出的第几个值
    count = 0;
}

-(IBAction)queryByTarinID:(id)sender{
    count = 0;
    trainId = inputTrainInfo.text;
    destElement = @"getStationAndTimeByTrainCodeResult";
    soapMessage = [NSString stringWithFormat:@"<?xml version=\"1.0\" encoding=\"utf-8\"?>"
        "<soap12:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap12=\"http://www.w3.org/2003/05/soap-envelope\">"
        "<soap12:Body>"
        "<getStationAndTimeByTrainCode xmlns=\"http://WebXml.com.cn/\">"
        "<TrainCode>%@</TrainCode>"
        "<UserID>%@</UserID>"
        "</getStationAndTimeByTrainCode>"
        "</soap12:Body>"
        "</soap12:Envelope>",trainId,@""];    
    NSLog(@"%@",soapMessage);
    // 创建URL
    NSURL *url = [NSURL URLWithString:@"http://webservice.webxml.com.cn/WebServices/TrainTimeWebService.asmx"];
    // 根据上面的URL创建一个请求
    NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:url];
    NSString *msgLength = [NSString stringWithFormat:@"%d", [soapMessage length]];
    // 添加请求的详细信息,与请求报文前半部分的各字段对应
    [req addValue:@"application/soap+xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
    [req addValue:msgLength forHTTPHeaderField:@"Content-Length"];
    // 设置请求行方法为POST,与请求报文第一行对应
    [req setHTTPMethod:@"POST"];
    // 将SOAP消息加到请求中
    [req setHTTPBody: [soapMessage dataUsingEncoding:NSUTF8StringEncoding]];
    
    // 创建连接
    conn = [[NSURLConnection alloc] initWithRequest:req delegate:self];
    if (conn) {
        responseData = [NSMutableData data];
    }
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

-(void)showQueryResult{
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"查询结果"
                                                    message:[NSString stringWithFormat:@"%@", queryResult]
                                                   delegate:self
                                          cancelButtonTitle:@"确定"
                                          otherButtonTitles:nil];
    [alert show];
}

#pragma mark -
#pragma mark URL Connection Data Delegate Methods

// 刚开始接受响应时
-(void) connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *) response{
    [responseData setLength: 0];
}

// 每接收到一部分数据就追加到responseData中
-(void) connection:(NSURLConnection *)connection didReceiveData:(NSData *) data {
    [responseData appendData:data];
}

// 出现错误时
-(void) connection:(NSURLConnection *)connection didFailWithError:(NSError *) error {
    conn = nil;
    responseData = nil;
}

// 完成接收数据时调用
-(void) connectionDidFinishLoading:(NSURLConnection *) connection {
    NSString *responseXML = [[NSString alloc] initWithBytes:[responseData mutableBytes]
                                                length:[responseData length]
                                              encoding:NSUTF8StringEncoding];
    printf("\n\n");
    
    // 打印出得到的XML
    NSLog(@"\n%@", responseXML);
    // 使用NSXMLParser解析出想要的结果
    xmlParser = [[NSXMLParser alloc] initWithData: responseData];
    [xmlParser setDelegate: self];
    [xmlParser setShouldResolveExternalEntities: YES];
    [xmlParser parse];
}

// 开始解析一个元素名
-(void) parser:(NSXMLParser *) parser didStartElement:(NSString *) elementName namespaceURI:(NSString *) namespaceURI qualifiedName:(NSString *) qName attributes:(NSDictionary *) attributeDict {
    if ([elementName isEqualToString:destElement]) {
        if (!queryResult) {
            queryResult = [[NSMutableString alloc] init];
        }
        elementFound = YES;
    }
    
}

// 追加找到的元素值,一个元素值可能会追加多次
-(void)parser:(NSXMLParser *) parser foundCharacters:(NSString *)string {
    if (elementFound) {
        switch (count++) {
            case 0:
                //NSLog(@"车次%@",string);
                [queryResult appendString: [NSString stringWithFormat:@"车次:%@\n",string]];
                break;
            case 1:
                //NSLog(@"发站%@",string);
                if([string isEqualToString:@"数据没有被发现"]){
                    [queryResult deleteCharactersInRange:NSMakeRange(0, [queryResult length])];
                    [queryResult appendString: [NSString stringWithFormat:@"%@",string]];
                    //停止解析
                    [xmlParser abortParsing];
                    [self showQueryResult];
                    return;
                }
                [queryResult appendString: [NSString stringWithFormat:@"发站:%@\n",string]];
                break;
            case 2:
                //NSLog(@"到站%@",string);
                [queryResult appendString: [NSString stringWithFormat:@"到站:%@\n",string]];
                break;
            case 3:
                break;
            case 4:
                //NSLog(@"发车时间%@",string);
                [queryResult appendString: [NSString stringWithFormat:@"发车时间:%@\n",string]];
                break;
            case 5:
                break;
            case 6:
                //NSLog(@"到站时间%@",string);
                [queryResult appendString: [NSString stringWithFormat:@"到站时间:%@\n",string]];
                break;
            case 7:
                //NSLog(@"里程%@",string);
                [queryResult appendString: [NSString stringWithFormat:@"里程:%@公里\n",string]];
                break;
            case 8:
                //NSLog(@"运行时间%@",string);
                [queryResult appendString: [NSString stringWithFormat:@"运行时间:%@小时\n",string]];
                break;
            default:
                break;
        }
        
    }
    //[queryResult appendString: string];
}

// 结束解析这个元素名
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
    if ([elementName isEqualToString:destElement]) {
        [self showQueryResult];
        elementFound = FALSE;
        //停止解析
        [xmlParser abortParsing];
    }
}

// 解析整个文件结束
- (void)parserDidEndDocument:(NSXMLParser *)parser {
    if (responseData) {
        responseData = nil;
    }
}

// 出错,例如强制停止解析
- (void) parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError {
    if (queryResult) {
        queryResult = nil;
    }
}
@end

5、运行效果如下:

需要源码的网友请留言哦

ios xml解析 NSXMLParser ios xml解析 NSXMLParser。 NSXMLParser是基于SAX的解析方式。NSXMLParser采用了委托设计模式,因此他的实现类需要采用协议并支持委托。NSXMLParser解析XML需要委托NSXMLParserDelegate实现。 立即下载

相关推荐

NSXMLParser解析XML

NULL 博文链接:https://eric-gao.iteye.com/blog/1590902

NSXMLParser详解

NSXMLParser详解 NSXMLParser 实现的是sax方法解析xml文件。 dom实现的原理是把整个xml文档一次性读出,放在一个树型结构里。在需要的时候,查找特定节点,然后对节点进行读或写。他的主要优势是实现简单,读写平衡;缺点是比较占内存,因为他要把整个xml文档都读入内存,文件越大,这种缺点就越明显。 sax的实现方法和dom不同。他只在xml文档中查找特...

aocaojia9711的博客 188

xmlparsing-with-nsxmlparser-tutorial:使用NSXMLParser进行XMLParsing-教程

xmlparsing-with-nsxmlparser-tutorial 你可以找到的NSXMLParser完整XMLParsing -教程这里 。 本教程由最好的The App Guruz提供。

IOS开发系列——xml文件解析

IOS开发系列——xml文件解析 一、概述 由于xml具有强大的扩展性及清晰的结构,使其广泛用于各种文件配置,比如皮肤配置;那么在IOS该如何解析xml文件呢?xml解析必然要用到xml解析库,有libxml、tinyxml等,但在IOS的API中提供了NSXMLParser类,通过NSXMLParser可以实现快速访问xml中相关字段; 二、NSXMLParser类几个重要

smallmuou的专栏 6004

AppStore逆向分析:从网络抓包到自动化模拟的完整实践

在移动应用生态中,理解客户端与服务器之间的通信协议是进行自动化测试、数据分析和系统集成的关键技术基础。通过分析网络请求与响应,可以深入理解认证、会话管理和数据交换的原理,这对于构建稳定的自动化流程至关重要。其技术价值在于能够实现合法场景下的流程模拟,例如应用元数据监控、沙盒环境测试或内部工具开发。在实际应用场景中,开发者常需处理登录态维持、请求签名验证及风控策略应对等挑战。本文聚焦于AppStore这一封闭生态,详细拆解了其登录、查询等核心环节的通信机制,并探讨了使用Python结合抓包工具进行安全逆向分析

weixin_42524171的博客 926

STM32巡线小车PID调参实战:从五路灰度传感器数据到稳定运行的避坑指南

本文详细介绍了STM32巡线小车的PID调参实战,从五路灰度传感器数据处理到PID参数优化,提供了系统化的调试方法和常见问题解决方案。通过加权平均法计算偏移量,逐步调整比例、积分、微分参数,实现小车稳定巡线。文章还涵盖了定时器配置、控制周期优化及高级调试技巧,帮助开发者避开常见陷阱,提升巡线性能。

weixin_42570484的博客 192

NSXMLParser 在AFNetworking中的使用

好吧,一下博文转自:http://www.tuicool.com/articles/Qnmu6f 对xml进行解析的标准有两种:sax以及dom。 首先这两种标准并不是针对java的,他们在各种语言环境下都可以实现。dom是真正的国际标准。sax是事实的标准,它不由任何商业组织维 护,而是由一个非商业的组织在运作。就像iso7层模型和tcp/ip一样,虽然sax不是正式的标准,但是一点不...

weixin_30633405的博客 155

手机拍照对焦快准狠的秘密:一文看懂PDAF、Dual Pixel和Super PD的区别

本文深入解析手机拍照中的三种主流相位检测自动对焦(PDAF)技术:Shield Pixel、Super PD和Dual Pixel。通过对比它们的原理、优缺点及实际表现,帮助读者理解不同技术的对焦速度、暗光表现和画质影响,从而做出更明智的购机选择。

weixin_26985923的博客 486

NSXMLParser(SAX解析)

NSXMLParser(SAX解析)实现

ITcontend的专栏 963

设置Solidworks导出文件的坐标系,stl坐标系平移

使用solidworks输出的模型坐标不再原点,怎么平行坐标系,这个方法很简单

weixin_45650767的博客 1万+

鲁棒控制理论 --- H∞ 控制(被裁篇)

鲁棒控制理论 --- H∞ 控制

记录老板的每次pua,分享领导每天的毒鸡汤... 6万+

XML数据解析———NSXMLParser

随笔写下成长点滴 解析XML数据

夏日_冬雪的博客 558

光学系统仿真软件:OSLO_(13).衍射光学元件设计v1

目标函数是设计DOE的关键步骤之一。目标函数可以是一个具体的光强分布,也可以是一个特定的波前形状。在仿真软件中,目标函数通常用数学表达式或数据文件来定义。假设我们需要设计一个二元相位掩模,使其在特定位置生成三个焦点。我们可以定义一个目标函数来描述这三个焦点的光强分布。# 定义目标函数"""定义一个多焦点目标函数:param x: 横坐标:param y: 纵坐标:param z1: 第一个焦点的深度:param z2: 第二个焦点的深度:param z3: 第三个焦点的深度。

kkchenjj的博客 1001

org.apache.tomcat.util.descriptor.web.WebXmlParser.parseWebXml 解析应用web.xml错误

经排查引入的第三方包里包含Dom4j的依赖,但是由于Dom4j引用pull-parserxml解析依赖,查找后发现会导致tomcat 读取xml文件故障。 两个方案解决: 1、在configurations 中全局排除pull-parser引用 configurations { all*.exclude group: 'pull-parser', module: 'pull-parser' } 2、Dom4j使用的pull-parser为2版本,可以引用pull-...

AMOR_M的博客 2706

KNN算法实现数据分类及matlab完整代码

其基本思想是:对于一个未知样本,找出与该样本距离最近的k个已知样本,然后根据这k个样本的类别来确定该未知样本的类别。在本文中,我们采用iris数据集,该数据集包含四个属性:花萼长度、花萼宽度、花瓣长度、花瓣宽度,以及三个类别:山鸢尾、变色鸢尾、维吉尼亚鸢尾。KNN算法具有简单、直观、易于理解等特点,适用于多分类和二分类问题,但其计算复杂度随着样本数量的增加而增加,也容易受异常值影响。在KNN算法中,常用的距离函数有欧氏距离、曼哈顿距离等。(2)选择距离最近的k个样本,并根据它们的类别来确定未知样本的类别。

qq_39605374的博客 1515

【23】OpenCV C++实战篇——张正友相机标定【相机标定原理、相机标定流程、标定结果评价、图像畸变矫正】

R是3×3的正交单位矩阵(即旋转矩阵),t为平移向量,R、t与摄像机无关,所以称这两个参数为摄像机的外参数(extrinsicparameter),可以理解为两个坐标原点之间的距离,因其受x,y,z三个方向上的分量共同控制,所以其具有三个自由度。R是3×3的正交单位矩阵(即旋转矩阵),t为平移向量,R、t与摄像机无关,所以称这两个参数为摄像机的外参数(extrinsicparameter),可以理解为两个坐标原点之间的距离,因其受x,y,z三个方向上的分量共同控制,所以其具有三个自由度。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 4479

XML解析--NSXMLParser和TouchXML

XML有两种解析方式: SAX解析 SAX:SimpleAPIfor XML。基于事件驱动的解析方式,逐行解析数据。(采用协议回调机制) DOM解析 DOM:DocumentObjectModel(文档对象模型)。解析时需要将XML文件整体读入,并且将XML结构化成树状,使用时再通过树状结构读取相关数据NSXMLParser是iOS自带的XML解析类。采用SAX方式解析数据, 解析过程由NSXMLP

NSLog博客 637

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

iOS XML数据解析

最近公司的活比较少,空闲时间十分多,遍寻思着写一款APP。在这个过程中便有使用到XML数据,于是研究了一下。目前写的这个是本地阅读软件,后续会把在写这个APP用到的技术以及遇到的问题都整理出来,通过博客的形式分享给大家。奇迹读书地址。

jiuchabaikaishui的专栏 1223

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

[iOS] XML解析

1. 相关的类 主导解析的类: @interface NSXMLParser : NSObject { } - (id)initWithContentsOfURL:(NSURL *)url;  // initializes the parser with the specified URL.- (id)initWithData:(NSData *)data; // create the p...

weixin_33923148的博客 123

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

NSXMLParser 解析XML

官方自带XML解析方法NSXMLParser NSXMLParser  采用SAX方式解析,不支持DOM github URL:  https://github.com/LiuRuian/ReferenceCode // ViewController.m 文件 #import "ViewController.h" #import "UserInfo.h" #import

189

(原)NSXMLParser详解

(Fannic原创,转载请注明出处 http://ylucy.cnblogs.com) NSXMLParser 实现的是sax方法解析xml文件。 dom实现的原理是把整个xml文档一次性读出,放在一个树型结构里。在需要的时候,查找特定节点,然后对节点进行读或写。他的主要优势是实现简单,读写平衡;缺点是比较占内存,因为他要把整个xml文档都读入内存,文件越大,这种缺点就越明显。 sax的实现...

weixin_30908103的博客 178

使用NSXMLParser解析XML数据

对xml进行解析的标准有两种:sax以及dom。 在iOS中,可以通过NSXMLParser实现sax方法解析xml文件。 主要内容: 1.使用NSXMLParser解析XML网址数据 2.使用NSXMLParser解析本地的XML文件

Jymn_Chen 5283
上一篇: iPhone开发【十八】自定义视图之ActionSheet中使用PickerView
下一篇: Couldn't register com.zyg.ios.XXX with the bootstrap server. Error: unknown error code.
程序员长弓
博客等级 码龄20年 650粉丝 183原创
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值