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

  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文件中的数据:存放到字符串中

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

用NSXMLParser实现解析:

  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.准备工作:

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

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

  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.处理错误:打印错误

    1. - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError{
    2. NSLog(@"%@",[parseError description]);
    3. }

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

  1. iOS开发——网络篇——JSON和XML,NSJSONSerialization ,NSXMLParser(XML解析器),NSXMLParserDelegate,MJExtension (字典转模型),GDataXML(三方框架解析XML)

    一.JSON 1.JSON简介什么是JSONJSON是一种轻量级的数据格式,一般用于数据交互服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外) JSON的格式很像OC中的字典 ...

  2. IOS成长之路-Xcode cannot run using the selected device. 解决办法

    PROJECT --> Info --> Deployment Target --> IOS Deployment Target  里面的值 要设置为  <=真机系统版本 TA ...

  3. IOS成长之路-调用照相机和相册功能(转)

    转载自:http://blog.csdn.net/like7xiaoben/article/details/8465237 //先设定sourceType为相机,然后判断相机是否可用(ipod)没相机 ...

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

    打开相机: //先设定sourceType为相机,然后判断相机是否可用(ipod)没相机,不可用将sourceType设定为相片库 UIImagePickerControllerSourceType ...

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

    NSString *str1 = @"can you \n speak English"; NSString *str = @"\n"; //在str1这个字符 ...

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

    NSString *str1 = @"can you \n speak English"; NSString *str = @"\n"; //在str1该字符串 ...

  7. iOS成长之路-使用系统默认声音、震动

    导入框架 代码片段 apple系统默认声音名称说明: 1.声音格式是MP3或m4r的需要转成caf格式(可先转成aif , aiff,然后修改后缀) 2.路径在/System/Library/Audi ...

  8. 大数据之路week04--day05(java XML解析)

    java解析XML的四种方式: XML是一种通用的数据交换格式,它的平台无关性.语言无关性.系统无关性.给数据集成与交互带来了极大的方便.XML在不同的语言环境中解析方式都是一样的,只不过实现的语法不 ...

  9. iOS平台XML解析类库对比和安装说明

    在iPhone开发中,XML的解析有很多选择,iOS SDK提供了NSXMLParser和libxml2两个类库,另外还有很多第三方类库可选,例如TBXML.TouchXML.KissXML.Tiny ...

随机推荐

  1. 一起学习Hibernate: Hibernate01 —— Hibernate的概述与入门案例

    一 Hibernate的介绍 1 让我们从JDBC与替代它的框架Hibernate进行一下对比. 1.1 JDBC的缺点 1) 代码结构繁琐.每次书写sql语句操作数据库都得需要很多步; 2) 是面向 ...

  2. Netty对WebSocket的支持(五)

    Netty对WebSocket的支持(五) 一.WebSocket简介 在Http1.0和Http1.1协议中,我们要实现服务端主动的发送消息到网页或者APP上,是比较困难的,尤其是现在IM(即时通信 ...

  3. 初学Python之 布尔类型

    与运算:只有两个布尔值都为 True 时,计算结果才为 True. True and True # ==> True True and False # ==> False False an ...

  4. ionic3 笔记

    ionic3的常用命令: //新建项目.ionic start ionic_tab tabs // 新建页面ionic g page NewPage// 查看usb链接的手机adb devices c ...

  5. socket模型处理多个客户端

    最近学完了简单的socket编程,发现其实socket的网络编程其实并没有什么难度,只是简单的函数调用,记住客户端与服务端的步骤,写起来基本没有什么问题. 在服务器程序的设计中,一个服务器不可能只相应 ...

  6. zz:linux下rz,sz的安装方法

    zz:http://xukaizijian.blog.163.com/blog/static/1704331192011611104631875/ wget http://ohse.de/uwe/re ...

  7. 【转载】从头编写 asp.net core 2.0 web api 基础框架 (1)

    工具: 1.Visual Studio 2017 V15.3.5+ 2.Postman (Chrome的App) 3.Chrome (最好是) 关于.net core或者.net core 2.0的相 ...

  8. 3DES加密

    本文介绍了3DES加密特性,加密特点,3DES是对称加密,用一个密钥对内容进行加密,必须使用相同的密钥进行解密, 密钥必须配置,而且长度为24位,不足24位,用0位进行补全,本文也顺带介绍了其它加密算 ...

  9. JavaScript基础知识(if、if else、else if、while、switch...case语句)

    13.语句 概念:就是分号(:) 代表一条语句的结束 习惯:一行只编写一条语句:一行编写多条语句(代码可读性较差) 语句块:可以包含多条语句     "{ }"将多条语句包裹 u ...

  10. Grails框架使用指南

    Grails框架使用指南,详解Grails框架!cnxieyang@163.com