iOS SDK中使用NSXMLParser解析XML(iphone网络篇三)

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文档结构组织相关实体类定义时的基本思路:把每个新节点容器都定义描述成一个新的实体类。
时间: 2024-12-28 20:58:43

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

IOS中使用TBXML解析XML

IOS SDK自带的NSXML框架是采用SAX模式解析的,是基于事件驱动型的,主要解析工作在NSXMLParseDelegate中完成,解析过程中遇到开始标签.结束标签.文档开始.文档结束和字符串时触发Delegate中的方法完成解析,这种方式使用起来还是比较麻烦的.在实际工作中,我们可以选用一个比较简单易用的第三方框架TBXML,其下载地址为:https://github.com/71squared/tbxml 下载完成解压后,我们只需要将TBXML-Headers和TBXML-Code文件夹

在AFN中使用NSXMLParser解析服务器返回的XML数据

服务器返回的XML格式: 因为苹果没有提供直接获取xml开始标签和结束标签中间的字符串,虽然提供了 - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string这个方法获取中间的字符串,但是这个字符串包含了空格和回车,所以要在这个方法中进行过滤. 源代码如下: 8 9 #import "RecommendController.h" 11 #import "SPHTTPRequestTool.h&

转:在java中使用dom4j解析xml

在java中使用dom4j解析xml 虽然Java中已经有了Dom和Sax这两种标准解析方式 但其操作起来并不轻松,对于我这么一个初学者来说,其中部分代码是活生生的恶心 为此,伟大的第三方开发组开发出了Jdom和Dom4j等工具 鉴于目前的趋势,我们这里来讲讲Dom4j的基本用法,不涉及递归等复杂操作 Dom4j的用法很多,官网上的示例有那么点儿晦涩,这里就不写了 首先我们需要出创建一个xml文档,然后才能对其解析 xml文档: <?xml version="1.0" encod

JAVA中使用DOM解析XML文件

JAVA中使用DOM解析XML文件: 创建DocumentBuilderFactory的对象                                 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 创建DocumentBuilder对象 通过documentBuilder对象的parser方法加载xml文件到当前项目下 获取所有XML文件内节点的集合    getElementsByTagName()方

java中采用dom4j解析xml文件

一.前言 在最近的开发中用到了dom4j来解析xml文件,以前听说过来解析xml文件的几种标准方式:但是从来的没有应用过来,所以可以在google中搜索dmo4j解析xml文件的方式,学习一下dom4j解析xml的具体操作. 二.代码详情    dom4j是一个第三方开发组开发出的插件,所以在我们使用dom4jf的时候我们要去下载一下dom4j对应版本的jar导入在我们项目中.  1)xml文件: <?xml version="1.0" encoding="UTF-8&

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

使用NSXMLParser解析xml文件 1. 设置委托对象,开始解析     NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];   //或者也可以使用initWithContentsOfURL直接下载文件,但是有一个原因不这么做:     // It's also possible to have NSXMLParser download the data, by passing it a URL, but this

iOS开发2-使用SAX解析XML数据

XML数据结构和解析 1.1XML数据结构 XML 是可扩展标记语言(Extensible Markup Language)的缩写,其中的 标记(markup)是关键部分.可以创建内容,然后使用限定标记标记它,从而使每个单词.短语或块成为可识别.可分类的信息.创建的文件,或文档实例 由元素(标记)和内容构成.当从打印输出读取或以电子形式处理文档时,元素能够帮助更好地理解文档.元素的描述性越强,文档各部分越容易识别.自从出现标记至今,带有标记的内容就有一个优势,即在计算机系统缺失时,仍然可以通过标

关于iOS SDK中HTTPS强制握手的经验分享

因项目需要,对HTTPS强制握手作了研究,分享处理方法如下: 一. 问题与需求 问题:接入方可能对同个域名做了HTTPS证书验证,在缓存机制下,进入SDK中默认复用HTTPS握手;或者NSURLProtocol对验证作了拦截. 需求: 基于SDK方不信任接入方验证,需强制重新握手. 二.理论前提 1. 握手缓存以IP地址,DNS域名,端口为KEY对握手作缓存 2. “www.xxx.com”, “www.xxx.com.”会有相同的DNS解析结果 三.解决方案 1. 服务器方给出专用IP,域名或

《转》 在C++中使用TinyXML2解析xml

读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好. TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译.这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树. DOM模型即文档对象模型,是将整个文档分成多个元素(如书.章.节.段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包