iPhone开发——Web Services查询火车信息

Home / iOS MrLee 2015-6-3 2798

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


2、修改ViewController.xib,添加一个TextField控件和一个Button。
3、修改ViewController.h,如下:
#import 
@interface ViewController : UIViewController {
    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
连接输出口inputTrainInfo及操作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:@""
        ""
        ""
        ""
        "%@"
        "%@"
        ""
        ""
        "",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、运行效果如下:

本文链接:https://www.it72.com/3128.htm

推荐阅读
最新回复 (0)
返回