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 ...
随机推荐
- C程序设计语言(第二版)--- 习题选
1. 解: 2. 解: 3. (分析的好有条理啊!) 4. 解:
- K:二叉树的非递归遍历
相关介绍: 二叉树的三种遍历方式(先序遍历,中序遍历,后序遍历)的非递归实现,虽然递归方式的实现较为简单且易于理解,但是由于递归方式的实现受其递归调用栈的深度的限制,当递归调用的深度超过限制的时候, ...
- zabbix 图形插件 Grafana的安装
看http://www.myexception.cn/software-testing/2008870.html 就好了.
- Js相关用法个人总结
Js相关用法个人总结 js中将数组元素添加到对象中var obj = {}; var pushArr = [11,22,33,44,55,66]; for(var i=0;i<pushArr. ...
- Java第二章----对象和类
从第一章到第二章整整隔了一个月的时间,这速度也是慢的无语了.因为这个月负责开发公司一个SaaS类型APP,忙的昏天暗地终于上线了,这才有时间写个博客.本章还是以概念为主,有点枯燥重在理解. 第一节:对 ...
- 关于Bitcoin的分叉之路
今年对与bitcoin来讲是不平凡的一年,它经历了价格的暴涨.腰斩和再次暴涨,对于这些现象背后的利益博弈网上分析的文章很多,我就不再赘述了.我们从技术的角度上分析一下bitcoin的发展历程,同时预测 ...
- [笔记]《JavaScript高级程序设计》- 最佳实践
一.可维护性 1 什么是可维护的代码 可理解性--其他人可以接受代码并理解它的意图和一般途径,而无需原开发人员的完整解释. 直观性--代码中的东西一看就能明白,不管其操作过程多么复杂. 可适应性--代 ...
- python3之日期和时间
1.python3日期和时间 Python 程序能用很多方式处理日期和时间,转换日期格式是一个常见的功能. Python 提供了一个 time 和 calendar 模块可以用于格式化日期和时间. 时 ...
- 【扩展欧几里得】NOIP2012同余方程
题目描述 求关于 x 的同余方程 ax ≡ 1 (mod b)的最小正整数解. 输入输出格式 输入格式: 输入只有一行,包含两个正整数 a, b,用一个空格隔开. 输出格式: 输出只有一行,包含一个正 ...
- linux搭建SS服务
基本准备: 购买主机:www.virmach.com LINUX系统操作经验:vim , apt-get 等命令的使用 putty.exe连接ssh工具的使用 开始 使用putty连接上去,并输入密码 ...