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 ...
随机推荐
- MySQL视图,触发器,事务,存储过程,函数
create triggr triafterinsertcmdlog after insert on cmd_log FOR EACH ROW trigger_body .#NEW : 代表新的记录 ...
- swiper轮播问题之二:默认显示3张图片,中间显示全部两边显示部分
其二:项目遇到比较有点要求的轮播图,默认显示3张图片,中间显示全部,两边显示部分.如图: 网上找了也没有找到合适的,最后经过自己摸索写了出来,贴出代码分享给大家. CSS .swipe ...
- 关于SPF记录的说明
详细了解SPF记录的可以查看一下这篇博文:http://www.renfei.org/blog/introduction-to-spf.html 关于 SPF SPF:Sender Policy Fr ...
- replace into 浅析之一
一 介绍 在笔者支持业务过程中,经常遇到开发咨询replace into 的使用场景以及注意事项,这里做个总结.从功能原理,性能和注意事项上做个说明.二 原理2.1 当表中存在主键但是不存在唯一建的 ...
- 从Unity中的Attribute到AOP(四)
本篇我们将逐一讲解Unity中经常使用的Attribute(Unity对应的文档版本为2018.1b). 首先是Serializable,SerializeField以及NonSerialized,H ...
- Python日志监控系统处理日志(pyinotify)
前言 最近项目中遇到一个用于监控日志文件的Python包pyinotify,结合自己的项目经验和网上的一些资料总结一下,总的原理是利用pyinotify模块监控日志文件夹,当日志到来的情况下,触发相应 ...
- Redis进阶实践之三如何在Windows系统上安装安装Redis
一.Redis的简介 Redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合 ...
- Flask框架
FLask框架的简单介绍 Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请 ...
- 模板层(template)
模板: 什么是模板? html+模板语法 模板语法: 1 变量:{{}} 深度查询: 通过句点符号 . 过滤器 filter {{var|filter_name}} 2 标签: {% tag %} f ...
- bootstrap-table操作之“删除”
最近在做一个新的后台管理系统,在对数据进行操作时需要写一个"删除"功能,如图所示: 下面我来描述一下实现过程中出现的bug以及解决方法: 1.href值为空(href=" ...