IOS成长之路-用NSXMLParser实现XML解析

再次对xml进行解析,又有了些理解,如果有不对的地方,请给小弟指出,谢谢!

[html] view plaincopy

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <result>
  3. <meeting addr="203">
  4. <creator>张一</creator>
  5. <member>
  6. <name>张二</name>
  7. <age>20</age>
  8. </member>
  9. <member>
  10. <name>张三</name>
  11. <age>21</age>
  12. </member>
  13. <member>
  14. <name>张四</name>
  15. <age>22</age>
  16. </member>
  17. </meeting>
  18. <meeting addr="204">
  19. <creator>李一</creator>
  20. <member>
  21. <name>李二</name>
  22. <age>20</age>
  23. </member>
  24. <member>
  25. <name>李三</name>
  26. <age>21</age>
  27. </member>
  28. <member>
  29. <name>李四</name>
  30. <age>22</age>
  31. </member>
  32. </meeting>
  33. </result>

1.获取xml文件中的数据:存放到字符串中

[cpp] view plaincopy

  1. //bundle是一个目录,包含了程序会使用到的资源
  2. NSString *path=[[NSBundle mainBundle] pathForResource:@"test" ofType:@"xml"];
  3. NSString *_xmlContent=[[NSString alloc] initWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];

用NSXMLParser实现解析:

[plain] view plaincopy

  1. NSXMLParser解析简要说明
  2. 1.是sax方法解析
  3. 2.需要创建NSXMLParser实例 (alloc)
  4. 并创建解析器 (initWithData:)
  5. 为解析器定义委托 (setDelegate:)
  6. 运行解析器 (parser)
  7. ++++++当parser初始化并执行parse语句时([parser parse]),程序会跳到代理方法里面走第一个代理方法++++++
  8. 3.这种解析方式是利用它的代理NSXMLParserDelegate实现的
  9. 第一个代理方法:开始处理xml数据,它会把整个xml遍历一遍,识别元素节点名称
  10. - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict;
  11. 第二个代理方法:也就是得到文本节点里存储的信息数据
  12. - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string;
  13. 第三个代理方法:存储从第二个代理方法中获取到的信息
  14. - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
  15. 这就是解析的过程,在这个过程中会不停的重复的执行这三个代理方法,直到遍历完成
  16. 另外:
  17. 解析开始执行的方法
  18. - (void)parserDidStartDocument:(NSXMLParser *)parser;
  19. 解析结束执行的方法
  20. - (void)parserDidEndDocument:(NSXMLParser *)parser;
  21. 当出现解析错误的时候,会执行这个方法
  22. - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError;

解析开始:

2.准备工作:

[cpp] view plaincopy

  1. NSXMLParser *parse=[[NSXMLParser alloc] initWithData:[_xmlContent dataUsingEncoding:NSUTF8StringEncoding]];
  2. [parse setDelegate:self];
  3. [parse parse];
  4. [parse release];

3.三个代理方法具体实现:

[cpp] view plaincopy

  1. //第一个代理方法:
  2. - (void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict
  3. {
  4. //判断是否是meeting
  5. if ([elementName isEqualToString:@"meeting"]) {
  6. //判断属性节点
  7. if ([attributeDict objectForKey:@"addr"]) {
  8. //获取属性节点中的值
  9. NSString *addr=[attributeDict objectForKey:@"addr"];
  10. }
  11. }
  12. //判断member
  13. if ([elementName isEqualToString:@"member"]) {
  14. NSLog(@"member"]);
  15. }
  16. }
  17. //第二个代理方法:
  18. - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
  19. {
  20. //获取文本节点中的数据,因为下面的方法要保存这里获取的数据,所以要定义一个全局变量(可修改的字符串)
  21. //NSMutableString *element = [[NSMutableString alloc]init];
  22. //这里要赋值为空,目的是为了清空上一次的赋值
  23. [element setString:@""];
  24. [element appendString:string];//string是获取到的文本节点的值,只要是文本节点都会获取(包括换行),然后到下个方法中进行判断区分
  25. }
  26. //第三个代理方法:
  27. - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName
  28. namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
  29. NSString *str=[[NSString alloc] initWithString:element];
  30. if ([elementName isEqualToString:@"creator"]) {
  31. NSLog(@"creator=%@",str);
  32. }
  33. if ([elementName isEqualToString:@"name"]) {
  34. NSLog(@"name=%@",str);
  35. }
  36. if ([elementName isEqualToString:@"age"]) {
  37. NSLog(@"age=%@",str);
  38. }
  39. [str release];
  40. }

注意:

解析xml数据的时候,

每当遇到元素节点的时候都会执行第一个代理方法,如果有属性节点,可以直接在这个方法中获取里面的值;

每当遇到文本节点的时候都会执行第二个代理方法,获取文本节点中的值然后到第三个方法中进行区分。

如果是换行符的话也会获取,因为换行符也是文本节点,不过当一个元素节点结束后的换行符是不会获取的。

比如说:      (换行符1)

<li>文本节点</li>

(换行符2)

元素节点前后各有一个换行符,这时只会获取换行符1,而不会获取换行符2。

4.处理错误:打印错误

[cpp] view plaincopy

    1. - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError{
    2. NSLog(@"%@",[parseError description]);
    3. }
时间: 2024-10-01 08:01:03

IOS成长之路-用NSXMLParser实现XML解析的相关文章

来自我的破船大大的博客,记录他的iOS成长之路,与君同勉!

注1:这篇文章是我的iOS成长之路系列文章中的第三篇文章,第一篇文章:iOS成长之路-1-入门,第二篇文章:iOS成长之路-2-我的第一个iOS Demo. 通过两周时间来学习iOS,我慢慢的叩开了iOS开发的大门,接下来就是一个积累的过程,我主要经历了如下几个过程: 饱览群书 跟着项目一起成长 与同行交流 做一些分享 饱览群书 在初期,我认为多看书对于个人提升有很大的帮助,从某方面来说,这主要扩展了个人对iOS开发的理解广度(初期,先不要急于往最深处研究),接着把书上的讲解与动手编程结合起来,

IOS成长之路-去掉屏幕键盘的方法

//定义两个文本框 UITextField *textName; UITextField *textSummary; //点击return 按钮 去掉 -(BOOL)textFieldShouldReturn:(UITextField *)textField { [textField resignFirstResponder]; return YES; } //点击屏幕空白处去掉键盘 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent

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

概要 本章主要简示了在IOS里面如何发出云请求,以及处理云端返回的数据,包括NSUrl等以及XML解析部分的知识.具体使用是一个查询IP的请求应用. 结果展示 (用了10几次不让用了) 流程概要 1.选取查询IP的云请求链接,并在浏览器里面试试效果,了解查询返回结果的格式 2.新建一个工程,拖拉一个UITextField和UIView,分别用作输入IP地址信息和查询结果展示 3.在发出云请求的时候,根据查询的IP构造查询的地址链接,然后使用NSURL生成链接,使用NSURLRequest构造请求

iOS成长之路

iOS9开始的新特性 nonnull\__nonnull nullable\__nonnullable null_resettable NS_ASSUME_NONNULL_BEGIN \ NS_ASSUME_NONNULL_END 泛型\__contravariant\__covariant __kindof UIWindow(使用方法已经跟之前不一样,一定要加控制器) Storyboard Reference UIStackView Search API 3D touch  新技术的了解渠道

iOS 成长之路 使用cocoapod导入第三方文件

关于cocoapod的安装 1.下载 打开终端输入sudo gem install cocoapods 2.使用cocoapods 终端:cd 到当前项目目录 2.1 输入vim Podfile 键盘输入 i,进入编辑模式,输入 platform :ios, '7.0' pod '你要的第三方sdk名','~>版本' 按esc 输入‘ :’符号 再输入wq保存你的配置 安装 输入  pod install 没错误则成功    关闭你的项目 重新打开就可以使用 第三方的sdk了

IOS成长之路-ASIHTTPRequest 断点续传

1.导入ASIHTTPRequest第三方类库 下载地址:ASIHttpRequest类库         完整代码下载:下载 2.在 .h 文件中 [cpp] view plaincopy #import <UIKit/UIKit.h> #import "ASIHTTPRequest.h" #import "ASINetworkQueue.h" @interface DownLoadViewController : UIViewController&l

IOS成长之路-Nsstring中搜索方法rangeOfString

NSString *str1 = @"can you \n speak English"; NSString *str = @"\n"; //在str1这个字符串中搜索\n,推断有没有 if ([str1 rangeOfString:str].location != NSNotFound) { NSLog(@"这个字符串中有\n"); } //rangeOfString 前面的參数是要被搜索的字符串,后面的是要搜索的字符 //NSNotFound

IOS成长之路-调用照相机和相册功能

打开相机: //先设定sourceType为相机,然后判断相机是否可用(ipod)没相机,不可用将sourceType设定为相片库 UIImagePickerControllerSourceType sourceType = UIImagePickerControllerSourceTypeCamera; // if (![UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeCamera]

IOS成长之路-Nsstring搜索方法rangeOfString

NSString *str1 = @"can you \n speak English"; NSString *str = @"\n"; //在str1该字符串搜索\n.它的结论是不存在 if ([str1 rangeOfString:str].location != NSNotFound) { NSLog(@"此字符串\n"); } //rangeOfString 在参数的前面是要搜索的字符串.返回搜索字符 //NSNotFound 它表示为一