iOS SDK的NSXMLParser解析XML文档是事件驱动模式的,即采用SAX方式来解析XML格式文档。NSXMLParser在处理XML文档的过程中当遇到一些要素(元素、属性、CDATA块、评论等)时会通知它的委托,而自身不对解析的要素进行任何处理,全权委托给NSXMLParserDelegate处理。同时它也会报告错误。

1. 打开一个xml文件,读取内容到NSData中。

NSString *path = [[NSBundle mainBundle] pathForResource:@"filename" ofType:@"xml"];
NSFileHandle *file = [NSFileHandle fileHandleForReadingAtPath:path];
NSData *data = [file readDataToEndOfFile];
[file closeFile];

2. 调用NSXMLParser的initWithData:方法,并设置代理delegate。

NSXMLParser *m_parser = [[NSXMLParser alloc] initWithData:data];
//设置该类本身为代理类,即该类在声明时要实现NSXMLParserDelegate委托协议
[m_parser setDelegate:self]; //设置代理为本地 BOOL flag = [m_parser parse]; //开始解析
if(flag) {
NSLog(@"获取指定路径的xml文件成功");
}else{
NSLog(@"获取指定路径的xml文件失败");
}
[m_parser release];

当然还可以有其他初始化生成方法,如:

NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:[NSURL URLWithString:urlString]];

直接自定义一个方法来实现创建解析:

 1 - (void)parseXMLFileAtURL:(NSURL *)URL parseError:(NSError **)error{
2 NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:URL];
3 [parser setDelegate:self];
4 [parser setShouldProcessNamespaces:NO];
5 [parser setShouldReportNamespacePrefixes:NO];
6 [parser setShouldResolveExternalEntities:NO];
7 [parser parse];
8 NSError *parseError = [parser parserError];
9 if (parseError && error) {
10 *error = parseError;
11 }
12 [parser release];
13 }

3. 调用回调函数。
      当完成上面的parser初始化并执行parser语句时([parser parse]),程序就会跳到代理方法,调用回调函数didStartElement,该方法会将整个xml遍历一遍,并识别xml里面的元素名称(elementName),在发现要查找的信息时,创建一个如数组或其他变量以便在合适的时候存储这些信息。一般地,具体完成相关存储的操作往往在didEndElement回调函数中完成。

//开始解析前,在这里可以做一些初始化工作
// 假设已声明有实例变量 dataDict,parserObject
- (void)parserDidStartDocument:(NSXMLParser *)parser {
dataDict = [[NSMutableDictionary alloc] initWithCapacity:0]; //每一条信息都用字典来存储
parserObjects = [[NSMutableArray alloc] init]; //每一组信息都用数组来存,最后得到的数据即在此数组中
}
//当解析器对象遇到xml的开始标记时,调用这个方法。
//获得结点头的值
//解析到一个开始tag,开始tag中可能会有properpies,例如<book catalog="Programming">
//所有的属性都存储在attributeDict中
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict {
if([elementName isEqualToString:@"book"]) {
NSString *catalog = [attributeDict objectForKey:@"catalog"];
}else if() {
//......
}
}
//当解析器找到开始标记和结束标记之间的字符时,调用这个方法。
//解析器,从两个结点之间读取具体内容
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
//记录所取得的文字列
} - (void)parser:(NSXMLParser *)parser foundCDATA:(NSData *)CDATABlock{
//NSLog(@"cData:%@",[NSString stringWithUTF8String:[CDATABlock bytes]]);
}
//当解析器对象遇到xml的结束标记时,调用这个方法。
//获取结点结尾的值,此处为一Tag的完成
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { }
//xml解析结束后的一些操作可在此
- (void)parserDidEndDocument:(NSXMLParser *)parser {
//.....
}

有关我学习NSXMLPareser解析xml曾经产生的问题与解疑:

  •  类似如下XML文档结构,其分析是从imgList开始读取,而不是img表节点。不然就只读取一次,是不会循环的。
    <imgList><img><src>图片地址1</src><name>图片名称1</name><url>图片指定超链接1</url></img>
    <img><src>图片地址2</src><name>图片名称2</name><url>图片指定超链接2</url></img></imgList>
  • 在根据xml文档结构组织相关实体类定义时的基本思路:把每个新节点容器都定义描述成一个新的实体类。

iOS SDK中使用NSXMLParser解析XML(iphone网络篇三)的更多相关文章

  1. java中采用dom4j解析xml文件

    一.前言 在最近的开发中用到了dom4j来解析xml文件,以前听说过来解析xml文件的几种标准方式:但是从来的没有应用过来,所以可以在google中搜索dmo4j解析xml文件的方式,学习一下dom4 ...

  2. 转:在java中使用dom4j解析xml

    JAVA 使用Dom4j 解析XML Java DOM4J Parser - Parse XML Document Dom4j下载及使用Dom4j读写XML简介 在java中使用dom4j解析xml ...

  3. NSXMLParser解析xml格式

    NSXMLParser解析xml格式的数据 用法如下: 首先,NSXMLParser必须继续NSXMLParserDelegate协议 @interface XMLHelper : NSObject ...

  4. iOS开发中的Html解析方法

    iOS开发中的Html解析方法 本文作者为大家介绍了在iOS开发中的Html解析方法,并同时提供了Demo代码的下载链接,Demo 解析了某个网站(具体可在代码中查看)的html网页,提取了图片以及标 ...

  5. XML专题:使用NSXMLParser解析xml文件

    使用NSXMLParser解析xml文件 1. 设置委托对象,开始解析     NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data ...

  6. JAVA中使用DOM解析XML文件

    XML是一种方便快捷高效的数据保存传输的格式,在JSON广泛使用之前,XML是服务器和客户端之间数据传输的主要方式.因此,需要使用各种方式,解析服务器传送过来的信息,以供使用者查看. JAVA作为一种 ...

  7. Python中使用ElementTree解析xml

    在Python中,ElementTree是我们常用的一个解析XML的模块 1.导入ElementTree模块 from xml.etree import ElementTree as ET 2.初始化 ...

  8. java中利用dom4j解析XML文件

    官网下载Dom4j地址:https://dom4j.github.io/ 注意:使用Dom4j开发,需下载dom4j相应的jar文件 题目:后台利用dom4j解析student.xml文件,并返回Li ...

  9. Qt中使用DOM解析XML文件或者字符串二(实例)

    介绍 在Qt中提供了QtXml模块实现了对XML数据的处理,我们在Qt帮助中输入关键字QtXml Module,可以看到该模块的类表.在这里我们可以看到所有相关的类,它们主要是服务于两种操作XML文档 ...

随机推荐

  1. 《从0到1学习Flink》—— Flink 项目如何运行?

    前言 之前写了不少 Flink 文章了,也有不少 demo,但是文章写的时候都是在本地直接运行 Main 类的 main 方法,其实 Flink 是支持在 UI 上上传 Flink Job 的 jar ...

  2. [转]gbk和utf8的区别

    转自:百度经验 GBK编码:是指中国的中文字符,其它它包含了简体中文与繁体中文字符,另外还有一种字符“gb2312”,这种字符仅能存储简体中文字符. UTF-8编码:它是一种全国家通过的一种编码,如果 ...

  3. 30分钟学会React Hook, Memo, Lazy

    我们来学习React 16.8里的新特性. 1. 自行配置好React的环境,推荐你使用Create React APP, 你也可以下载本文档Zip解压到本地直接运行. https://github. ...

  4. 一般处理程序ashx

    在用户列表中链接数据库 在这里Html只管做Post 请求,其他逻辑全部交给ashx 其中修改需要隐藏域 1.展现列表 public void ProcessRequest (HttpContext ...

  5. Morris.js-利用JavaScript生成时序图

    morris.js是一个轻量级的时间序列javascript类库,是网页显示图表的好工具.github项目地址:点击打开,使用起来很简单,但是需要你有一点网页设计的一些基本知识,对一个网页内容的结构要 ...

  6. 扔掉360:Linux下无线网卡作WiFi路由器(转薄荷开源网)

    这个话题很多人感兴趣,毕竟现在是无线互联时代.手机一族到外面去,首先关心的就是有没有 WiFi.Windows 7 用户可以安装 360 的软件,把笔记本电脑配置成路由器,供手机或其他电脑上网. 在 ...

  7. 如何在VS中快速导入新的源码以及文件夹

    参考链接:http://www.cjjjs.com/paper/xmkf/201641716212844.aspx 在visual studio 2013中尝试发现的问题:原文中“显示所有文件 ”的操 ...

  8. Visual Studio 2015 Preview 使用中问题一枚

    只要碰到IO读写,文件不存在之类的系统异常,就会崩溃一下给你看看.直接重新VS. 不该有的问题确实存在着???? 正常情况是这样的 直接崩溃时万万不行的!!!!

  9. Android商城开发系列(十三)—— 首页热卖商品布局实现

    热卖商品布局效果如下图: 这个布局跟我们上节做的推荐是一样的,也是用LinearLayout和GridView去实现的,新建一个hot_item.xml,代码如下所示: <?xml versio ...

  10. cms-幻灯片的实现

    1.其实幻灯片的后台代码和之前的最新动态和推荐是一样的,只是前台遍历的时候不一样罢了 2.代码: 2.1:帖子mapper查询出幻灯片图片: <?xml version="1.0&qu ...