IOS成长之路-用NSXMLParser实现XML解析
再次对xml进行解析,又有了些理解,如果有不对的地方,请给小弟指出,谢谢!
- <?xml version="1.0" encoding="UTF-8"?>
- <result>
- <meeting addr="203">
- <creator>张一</creator>
- <member>
- <name>张二</name>
- <age>20</age>
- </member>
- <member>
- <name>张三</name>
- <age>21</age>
- </member>
- <member>
- <name>张四</name>
- <age>22</age>
- </member>
- </meeting>
- <meeting addr="204">
- <creator>李一</creator>
- <member>
- <name>李二</name>
- <age>20</age>
- </member>
- <member>
- <name>李三</name>
- <age>21</age>
- </member>
- <member>
- <name>李四</name>
- <age>22</age>
- </member>
- </meeting>
- </result>
1.获取xml文件中的数据:存放到字符串中
- //bundle是一个目录,包含了程序会使用到的资源
- NSString *path=[[NSBundle mainBundle] pathForResource:@"test" ofType:@"xml"];
- NSString *_xmlContent=[[NSString alloc] initWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
用NSXMLParser实现解析:
- NSXMLParser解析简要说明
- 1.是sax方法解析
- 2.需要创建NSXMLParser实例 (alloc)
- 并创建解析器 (initWithData:)
- 为解析器定义委托 (setDelegate:)
- 运行解析器 (parser)
- ++++++当parser初始化并执行parse语句时([parser parse]),程序会跳到代理方法里面走第一个代理方法++++++
- 3.这种解析方式是利用它的代理NSXMLParserDelegate实现的
- 第一个代理方法:开始处理xml数据,它会把整个xml遍历一遍,识别元素节点名称
- - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict;
- 第二个代理方法:也就是得到文本节点里存储的信息数据
- - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string;
- 第三个代理方法:存储从第二个代理方法中获取到的信息
- - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
- 这就是解析的过程,在这个过程中会不停的重复的执行这三个代理方法,直到遍历完成
- 另外:
- 解析开始执行的方法
- - (void)parserDidStartDocument:(NSXMLParser *)parser;
- 解析结束执行的方法
- - (void)parserDidEndDocument:(NSXMLParser *)parser;
- 当出现解析错误的时候,会执行这个方法
- - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError;
解析开始:
2.准备工作:
- NSXMLParser *parse=[[NSXMLParser alloc] initWithData:[_xmlContent dataUsingEncoding:NSUTF8StringEncoding]];
- [parse setDelegate:self];
- [parse parse];
- [parse release];
3.三个代理方法具体实现:
- //第一个代理方法:
- - (void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict
- {
- //判断是否是meeting
- if ([elementName isEqualToString:@"meeting"]) {
- //判断属性节点
- if ([attributeDict objectForKey:@"addr"]) {
- //获取属性节点中的值
- NSString *addr=[attributeDict objectForKey:@"addr"];
- }
- }
- //判断member
- if ([elementName isEqualToString:@"member"]) {
- NSLog(@"member"]);
- }
- }
- //第二个代理方法:
- - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
- {
- //获取文本节点中的数据,因为下面的方法要保存这里获取的数据,所以要定义一个全局变量(可修改的字符串)
- //NSMutableString *element = [[NSMutableString alloc]init];
- //这里要赋值为空,目的是为了清空上一次的赋值
- [element setString:@""];
- [element appendString:string];//string是获取到的文本节点的值,只要是文本节点都会获取(包括换行),然后到下个方法中进行判断区分
- }
- //第三个代理方法:
- - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName
- namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
- NSString *str=[[NSString alloc] initWithString:element];
- if ([elementName isEqualToString:@"creator"]) {
- NSLog(@"creator=%@",str);
- }
- if ([elementName isEqualToString:@"name"]) {
- NSLog(@"name=%@",str);
- }
- if ([elementName isEqualToString:@"age"]) {
- NSLog(@"age=%@",str);
- }
- [str release];
- }
注意:
解析xml数据的时候,
每当遇到元素节点的时候都会执行第一个代理方法,如果有属性节点,可以直接在这个方法中获取里面的值;
每当遇到文本节点的时候都会执行第二个代理方法,获取文本节点中的值然后到第三个方法中进行区分。
如果是换行符的话也会获取,因为换行符也是文本节点,不过当一个元素节点结束后的换行符是不会获取的。
比如说: (换行符1)
<li>文本节点</li>
(换行符2)
元素节点前后各有一个换行符,这时只会获取换行符1,而不会获取换行符2。
4.处理错误:打印错误
- - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError{
- NSLog(@"%@",[parseError description]);
- }
IOS成长之路-用NSXMLParser实现XML解析的更多相关文章
- iOS开发——网络篇——JSON和XML,NSJSONSerialization ,NSXMLParser(XML解析器),NSXMLParserDelegate,MJExtension (字典转模型),GDataXML(三方框架解析XML)
一.JSON 1.JSON简介什么是JSONJSON是一种轻量级的数据格式,一般用于数据交互服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外) JSON的格式很像OC中的字典 ...
- IOS成长之路-Xcode cannot run using the selected device. 解决办法
PROJECT --> Info --> Deployment Target --> IOS Deployment Target 里面的值 要设置为 <=真机系统版本 TA ...
- IOS成长之路-调用照相机和相册功能(转)
转载自:http://blog.csdn.net/like7xiaoben/article/details/8465237 //先设定sourceType为相机,然后判断相机是否可用(ipod)没相机 ...
- IOS成长之路-调用照相机和相册功能
打开相机: //先设定sourceType为相机,然后判断相机是否可用(ipod)没相机,不可用将sourceType设定为相片库 UIImagePickerControllerSourceType ...
- IOS成长之路-Nsstring中搜索方法rangeOfString
NSString *str1 = @"can you \n speak English"; NSString *str = @"\n"; //在str1这个字符 ...
- IOS成长之路-Nsstring搜索方法rangeOfString
NSString *str1 = @"can you \n speak English"; NSString *str = @"\n"; //在str1该字符串 ...
- iOS成长之路-使用系统默认声音、震动
导入框架 代码片段 apple系统默认声音名称说明: 1.声音格式是MP3或m4r的需要转成caf格式(可先转成aif , aiff,然后修改后缀) 2.路径在/System/Library/Audi ...
- 大数据之路week04--day05(java XML解析)
java解析XML的四种方式: XML是一种通用的数据交换格式,它的平台无关性.语言无关性.系统无关性.给数据集成与交互带来了极大的方便.XML在不同的语言环境中解析方式都是一样的,只不过实现的语法不 ...
- iOS平台XML解析类库对比和安装说明
在iPhone开发中,XML的解析有很多选择,iOS SDK提供了NSXMLParser和libxml2两个类库,另外还有很多第三方类库可选,例如TBXML.TouchXML.KissXML.Tiny ...
随机推荐
- 面向对象 初级版 (Preview) 未完
概述: 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数里,日后使用无需重复编写,直接调用韩顺即可. 面向对象: 对函数进行分类和封装,让开发'更快更强' 面向对象和面向过程的通 ...
- Ruby学习之对象模型
这两周工作内容较多,平时自己也有点不在状态,学的东西有点少了,趁着现在还有点状态,赶紧复习一下之前学习的Ruby吧. Ruby是我真正开始接触动态语言魅力的第一个语言,之前虽然也用过且一直用perl. ...
- 关于Oracle开启自动收集统计信息的SPA测试
主题:关于Oracle开启自动收集统计信息的SPA测试 环境:Oracle RAC 11.2.0.4(Primary + Standby) 需求:生产Primary库由于历史原因关闭了自动统计信息的收 ...
- mac pycharm快捷键整理
转自:http://www.jianshu.com/p/be0bdc02f7da (感谢整理,另外,简书似乎很不错,排版很nice.) Pycharm 快捷键 shift cmd + 展开所有 shi ...
- Python3.x 配置原生虚拟环境
Python 3.4 之后支持原生的虚拟环境配置(3.3的虚拟环境不支持pip),把配置过程记录一下备忘. 1.创建虚拟环境 在控制台中,使用cd目录,切换到需要创建虚拟环境的目录. 使用如下命令,在 ...
- angular4.0如何引入外部插件2:declare方案
前面有个<angular4.0如何引入外部插件1:import方案>,但是有局限,因为方案1需要用到@types这个东西. 但是并不是每一个插件都有@types,所以现在写个方案2. 拿引 ...
- [Spark内核] 第40课:CacheManager彻底解密:CacheManager运行原理流程图和源码详解
本课主题 CacheManager 运行原理图 CacheManager 源码解析 CacheManager 运行原理图 [下图是CacheManager的运行原理图] 首先 RDD 是通过 iter ...
- HDFS Architecture
http://hadoop.apache.org/docs/r2.9.0/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html Introduction Ha ...
- 大公司的资深工程师和小公司的Leader如何决择?
很多人在技术的道路上,都会面临选择,一个是大公司的资深工程师/技术专家,一个是小公司的leader,这个选择是一条分叉路口,是持续纵向深入发展,还是横向发展.这实际上就是个人职业规划问题. 接着往专家 ...
- Windows资源
Windows资源是一种二进制数据,由链接器链接进程序成为程序的一部分,通过资源的方式可以很方便的对应用程序进行扩展.在Windows中资源可以是系统自定义的,也可以是用户自定义的.在VC++中资源是 ...