iPhone开发【十九】XML解析之NSXMLParser(使用Web Services查询火车信息)
发布日期:2021-09-28 18:46:33 浏览次数:14 分类:技术文章

本文共 6378 字,大约阅读时间需要 21 分钟。

转载请注明出处,原文网址: 作者:张燕广

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

关键词:NSXMLParser XML解析

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

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

3、修改ViewController.h,如下:

[cpp] 
  1. #import <UIKit/UIKit.h>  
  2.   
  3. @interface ViewController : UIViewController<NSXMLParserDelegate, NSURLConnectionDelegate> {  
  4.     bool elementFound;  
  5.     uint count;  
  6. }  
  7.   
  8. @property(strong,nonatomic)NSURLConnection *conn;  
  9. @property(strong,nonatomic)NSString *soapMessage;  
  10. @property(strong,nonatomic)NSXMLParser *xmlParser;  
  11. @property(strong,nonatomic)NSMutableData *responseData;  
  12. @property(strong,nonatomic)NSMutableString *queryResult;  
  13. @property(strong,nonatomic)NSString *trainId;  
  14. @property(strong,nonatomic)NSString *destElement;  
  15.   
  16. @property(strong,nonatomic)IBOutlet UITextField *inputTrainInfo;  
  17. -(IBAction)queryByTarinID:(id)sender;  
  18. @end  
连接输出口in
putTrainInfo及操作queryByTrainId,如下:

4、修改ViewController.m,如下:

[cpp] 
  1. #import "ViewController.h"  
  2.   
  3. @interface ViewController ()  
  4.   
  5. @end  
  6.   
  7. @implementation ViewController  
  8. @synthesize conn;  
  9. @synthesize soapMessage;  
  10. @synthesize xmlParser;  
  11. @synthesize responseData;  
  12. @synthesize trainId;  
  13. @synthesize destElement;  
  14. @synthesize queryResult;  
  15. @synthesize inputTrainInfo;  
  16. - (void)viewDidLoad  
  17. {  
  18.     [super viewDidLoad];  
  19.     // Do any additional setup after loading the view, typically from a nib.  
  20.     //解析出的第几个值  
  21.     count = 0;  
  22. }  
  23.   
  24. -(IBAction)queryByTarinID:(id)sender{  
  25.     count = 0;  
  26.     trainId = inputTrainInfo.text;  
  27.     destElement = @"getStationAndTimeByTrainCodeResult";  
  28.     soapMessage = [NSString stringWithFormat:@"<?xml version=\"1.0\" encoding=\"utf-8\"?>"  
  29.         "<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\">"  
  30.         "<soap12:Body>"  
  31.         "<getStationAndTimeByTrainCode xmlns=\"http://WebXml.com.cn/\">"  
  32.         "<TrainCode>%@</TrainCode>"  
  33.         "<UserID>%@</UserID>"  
  34.         "</getStationAndTimeByTrainCode>"  
  35.         "</soap12:Body>"  
  36.         "</soap12:Envelope>",trainId,@""];      
  37.     NSLog(@"%@",soapMessage);  
  38.     // 创建URL  
  39.     NSURL *url = [NSURL URLWithString:@"http://webservice.webxml.com.cn/WebServices/TrainTimeWebService.asmx"];  
  40.     // 根据上面的URL创建一个请求  
  41.     NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:url];  
  42.     NSString *msgLength = [NSString stringWithFormat:@"%d", [soapMessage length]];  
  43.     // 添加请求的详细信息,与请求报文前半部分的各字段对应  
  44.     [req addValue:@"application/soap+xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];  
  45.     [req addValue:msgLength forHTTPHeaderField:@"Content-Length"];  
  46.     // 设置请求行方法为POST,与请求报文第一行对应  
  47.     [req setHTTPMethod:@"POST"];  
  48.     // 将SOAP消息加到请求中  
  49.     [req setHTTPBody: [soapMessage dataUsingEncoding:NSUTF8StringEncoding]];  
  50.       
  51.     // 创建连接  
  52.     conn = [[NSURLConnection alloc] initWithRequest:req delegate:self];  
  53.     if (conn) {  
  54.         responseData = [NSMutableData data];  
  55.     }  
  56. }  
  57.   
  58. - (void)viewDidUnload  
  59. {  
  60.     [super viewDidUnload];  
  61.     // Release any retained subviews of the main view.  
  62. }  
  63.   
  64. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation  
  65. {  
  66.     return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);  
  67. }  
  68.   
  69. -(void)showQueryResult{  
  70.     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"查询结果"  
  71.                                                     message:[NSString stringWithFormat:@"%@", queryResult]  
  72.                                                    delegate:self  
  73.                                           cancelButtonTitle:@"确定"  
  74.                                           otherButtonTitles:nil];  
  75.     [alert show];  
  76. }  
  77.   
  78. #pragma mark -  
  79. #pragma mark URL Connection Data Delegate Methods  
  80.   
  81. // 刚开始接受响应时  
  82. -(void) connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *) response{  
  83.     [responseData setLength: 0];  
  84. }  
  85.   
  86. // 每接收到一部分数据就追加到responseData中  
  87. -(void) connection:(NSURLConnection *)connection didReceiveData:(NSData *) data {  
  88.     [responseData appendData:data];  
  89. }  
  90.   
  91. // 出现错误时  
  92. -(void) connection:(NSURLConnection *)connection didFailWithError:(NSError *) error {  
  93.     conn = nil;  
  94.     responseData = nil;  
  95. }  
  96.   
  97. // 完成接收数据时调用  
  98. -(void) connectionDidFinishLoading:(NSURLConnection *) connection {  
  99.     NSString *responseXML = [[NSString alloc] initWithBytes:[responseData mutableBytes]  
  100.                                                 length:[responseData length]  
  101.                                               encoding:NSUTF8StringEncoding];  
  102.     printf("\n\n");  
  103.       
  104.     // 打印出得到的XML  
  105.     NSLog(@"\n%@", responseXML);  
  106.     // 使用NSXMLParser解析出想要的结果  
  107.     xmlParser = [[NSXMLParser alloc] initWithData: responseData];  
  108.     [xmlParser setDelegate: self];  
  109.     [xmlParser setShouldResolveExternalEntities: YES];  
  110.     [xmlParser parse];  
  111. }  
  112.   
  113. // 开始解析一个元素名  
  114. -(void) parser:(NSXMLParser *) parser didStartElement:(NSString *) elementName namespaceURI:(NSString *) namespaceURI qualifiedName:(NSString *) qName attributes:(NSDictionary *) attributeDict {  
  115.     if ([elementName isEqualToString:destElement]) {  
  116.         if (!queryResult) {  
  117.             queryResult = [[NSMutableString alloc] init];  
  118.         }  
  119.         elementFound = YES;  
  120.     }  
  121.       
  122. }  
  123.   
  124. // 追加找到的元素值,一个元素值可能会追加多次  
  125. -(void)parser:(NSXMLParser *) parser foundCharacters:(NSString *)string {  
  126.     if (elementFound) {  
  127.         switch (count++) {  
  128.             case 0:  
  129.                 //NSLog(@"车次%@",string);  
  130.                 [queryResult appendString: [NSString stringWithFormat:@"车次:%@\n",string]];  
  131.                 break;  
  132.             case 1:  
  133.                 //NSLog(@"发站%@",string);  
  134.                 if([string isEqualToString:@"数据没有被发现"]){  
  135.                     [queryResult deleteCharactersInRange:NSMakeRange(0, [queryResult length])];  
  136.                     [queryResult appendString: [NSString stringWithFormat:@"%@",string]];  
  137.                     //停止解析  
  138.                     [xmlParser abortParsing];  
  139.                     [self showQueryResult];  
  140.                     return;  
  141.                 }  
  142.                 [queryResult appendString: [NSString stringWithFormat:@"发站:%@\n",string]];  
  143.                 break;  
  144.             case 2:  
  145.                 //NSLog(@"到站%@",string);  
  146.                 [queryResult appendString: [NSString stringWithFormat:@"到站:%@\n",string]];  
  147.                 break;  
  148.             case 3:  
  149.                 break;  
  150.             case 4:  
  151.                 //NSLog(@"发车时间%@",string);  
  152.                 [queryResult appendString: [NSString stringWithFormat:@"发车时间:%@\n",string]];  
  153.                 break;  
  154.             case 5:  
  155.                 break;  
  156.             case 6:  
  157.                 //NSLog(@"到站时间%@",string);  
  158.                 [queryResult appendString: [NSString stringWithFormat:@"到站时间:%@\n",string]];  
  159.                 break;  
  160.             case 7:  
  161.                 //NSLog(@"里程%@",string);  
  162.                 [queryResult appendString: [NSString stringWithFormat:@"里程:%@公里\n",string]];  
  163.                 break;  
  164.             case 8:  
  165.                 //NSLog(@"运行时间%@",string);  
  166.                 [queryResult appendString: [NSString stringWithFormat:@"运行时间:%@小时\n",string]];  
  167.                 break;  
  168.             default:  
  169.                 break;  
  170.         }  
  171.           
  172.     }  
  173.     //[queryResult appendString: string];  
  174. }  
  175.   
  176. // 结束解析这个元素名  
  177. -(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {  
  178.     if ([elementName isEqualToString:destElement]) {  
  179.         [self showQueryResult];  
  180.         elementFound = FALSE;  
  181.         //停止解析  
  182.         [xmlParser abortParsing];  
  183.     }  
  184. }  
  185.   
  186. // 解析整个文件结束  
  187. - (void)parserDidEndDocument:(NSXMLParser *)parser {  
  188.     if (responseData) {  
  189.         responseData = nil;  
  190.     }  
  191. }  
  192.   
  193. // 出错,例如强制停止解析  
  194. - (void) parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError {  
  195.     if (queryResult) {  
  196.         queryResult = nil;  
  197.     }  
  198. }  
  199. @end  

5、运行效果如下:

需要源码的网友请留言哦

转载地址:https://blog.csdn.net/h3c4lenovo/article/details/8568207 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:iPhone开发【二十】数据持久化总结之第1篇—NSUserDefaults
下一篇:iPhone开发【十八】自定义视图之ActionSheet中使用PickerView

发表评论

最新留言

路过按个爪印,很不错,赞一个!
[***.219.124.196]2024年04月18日 23时00分19秒