IOS中的XML解析之DOM和SAX
| 一、介绍 |
dom是w3c指定的一套规范标准,核心是按树形结构处理数据,dom解析器读入xml文件并在内存中建立一个结构一模一样的“树”,这树各节点和xml各标记对应,通过操纵此“树”来处理xml中的文件。xml文件很大时,建立的“树”也会大,所以会大量占用内存。
sax解析器核心是事件处理机制。例如解析器发现一个标记的开始标记时,将所发现的数据会封装为一个标记开始事件,并把这个报告给事件处理器,事件处理器再调用方法(startElement)处理发现的数据。下面我们尝试一下SAX和DOM解析:
XML格式如下:

| 二、SAX: |
1、我们用SAX解析的时候用的是苹果自带的NSXMLParser,首先初始化一个解析器,通过设置代理开始解析,代码如下:
//初始化路径
NSString * path=[[NSBundle mainBundle] pathForResource:@"Test.xml" ofType:nil];
NSData * data=[NSData dataWithContentsOfFile:path];
//初始化解析器
NSXMLParser * parser=[[NSXMLParser alloc] initWithData:data];
//设置代理
parser.delegate=self;
//开始解析
[parser parse];
2、通过代理方法开始解析,由于sax方式是事件驱动,因此解析是按照顺序解析,如果想获取标签的数据我们需要监控每个步骤的解析情况,因此系统提供了代理方法给我们,下面便是常用代理方法:
//开始加载文档
- (void)parserDidStartDocument:(NSXMLParser *)parser{} //结束加载文档
- (void)parserDidEndDocument:(NSXMLParser *)parser{ }
//开始解析标签
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
}
//标签解析结束
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
}
//读取标签之间的文本
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
content=string;
}
3、XM有两种存值方式,一个是属性,一个是标签之间的文本。如果我们想获取属性需要在代理方法中获取,如图:

如果是获取标签之间的文本需要采用代理方法如图:

总结:通过给定代理方法的结合我们便可以轻松的获取XML的内容
| 三、DOM |
1、我们用DOM解析的时候用的是第三方框架GDataXMLNode,该框架为动态库。我们需要引入如下:

同时需要引入第三方支持框架:

DOM解析相对于SAX稍微简单一些,DOM 首先将整个文件全部放入内存。然后在内存中以二叉树的形式获取里面的元素内容。
涉及到的主要类:
GDataXMLDocument //整个文档
GDataXMLElement //节点对象
GDataXMLNode //属性节点对象
我们可以用以下方法解析数据
//初始化
//将文件加入到内存
GDataXMLDocument * document=[[GDataXMLDocument alloc] initWithData:data options: error:nil];
//获取根元素
GDataXMLElement * root=document.rootElement;
//获取所有该名称的子节点
-(NSArray *)elementsForName:(NSString *)name;
//根据名称获取属性值
-(GDataXMLNode*)attributeForName:(NSString *)name;
这样我们便可以轻松解析并且获取XMl的值了,如图:

想要了解更多内容的小伙伴,可以点击查看源码,亲自运行测试。
疑问咨询或技术交流,请加入官方QQ群:
(452379712)
出处:http://www.cnblogs.com/jerehedu/
本文版权归烟台杰瑞教育科技有限公司和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
IOS中的XML解析之DOM和SAX的更多相关文章
- iOS 中的 xml 解析
在ios 中解析xml 的方法有很多种 1.苹果原生 NSXMLParser:SAX方式解析,使用简单 2.第三方框架 libxml2:纯c语言,默认包含在ios sdk中,同时支持DOM 和 SA ...
- iOS 中的XML解析代码(SAX)
1.XML解析(SAX) NSXMLParser SAX 大文件 1)打开文档 - (void)parserDidStartDocument:(NSXMLParser *)parser 2)开始查找起 ...
- java xml解析方式(DOM、SAX、JDOM、DOM4J)
XML值可扩展标记语言,是用来传输和存储数据的. XMl的特定: XMl文档必须包含根元素.该元素是所有其他元素的父元素.XML文档中的元素形成了一颗文档树,树中的每个元素都可存在子元素. 所有XML ...
- iOS - - JSON 和 XML解析
JSON 和 XML 一.JSON 1.什么是JSON JSON是一种轻量级的数据格式,一般用于数据交互 服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外) 2.JSON的格 ...
- XML的解析方式(DOM、SAX、StAX)
(新) XML的解析方式(DOM.SAX.StAX) 博客分类: XML 一般来说,解析XML文件存在着两种方式,一种是event-based API,比如说象SAX,XNI. 第二种是tree ...
- XML - 十分钟了解XML结构以及DOM和SAX解析方式
引言 NOKIA 有句著名的广告语:"科技以人为本".不论什么技术都是为了满足人的生产生活须要而产生的.详细到小小的一个手机.里面蕴含的技术也是浩如烟海.是几千年来人类科技的结晶, ...
- XML解析(一) DOM解析
XML解析技术主要有三种: (1)DOM(Document Object Model)文档对象模型:是 W3C 组织推荐的解析XML 的一种方式,即官方的XML解析技术. (2)SAX(Simple ...
- - XML 解析 总结 DOM SAX PULL MD
目录 目录 XML 解析 总结 DOM SAX PULL MD 几种解析方式简介 要解析的内容 DOM 解析 代码 输出 SAX 解析 代码 输出 JDOM 解析 代码 输出 DOM4J 解析 代码 ...
- JavaEE实战——XML文档DOM、SAX、STAX解析方式详解
原 JavaEE实战--XML文档DOM.SAX.STAX解析方式详解 2016年06月22日 23:10:35 李春春_ 阅读数:3445 标签: DOMSAXSTAXJAXPXML Pull 更多 ...
随机推荐
- Spring中@Transactional事务回滚
转载: Spring中@Transactional事务回滚 一.使用场景举例 在了解@Transactional怎么用之前我们必须要先知道@Transactional有什么用.下面举个栗子:比如一个部 ...
- ref:phpstorm配置远程调试(xdebug)(docker中)
ref:https://www.cnblogs.com/yjken/p/6555438.html readme:本文设置远程调试ubuntu中的php代码. 在docker中也可以,经过测试phpin ...
- seat
Install packages sudo apt-get update sudo apt-get install -y curl curl -sSL https://git.io/vVHhe | b ...
- TensorFlow——module 'tensorflow' has no attribute 'xxx'
tf.sub()更改为tf.subtract() tf.mul()更改为tf.multiply() tf.types.float32更改为tf.float32 tf.pact()更改为tf.stact ...
- Redis学习篇(八)之连接相关
PING 测试客户端和服务器之间的连接是否有效,有效返回PONG ECHO 打印特定的信息, 如: ECHO 'HELLO WORLD' QUIT/EXIT 断开当前客户端与服务器之间的连接,可以重连 ...
- PHP的数据类型与常量使用
数据类型之间的相互转换 1.强制转换:setType(变量,类型):这个函数将原变量的类型改变//integer,int,float,double,bool,boolen,string,arry,ob ...
- CF614A【签到题】
题目链接[http://codeforces.com/problemset/problem/614/A] 题意:输入三个数l.r.k(1 ≤ l ≤ r ≤ 1018, 2 ≤ k ≤ 109),输出 ...
- 【BZOJ 2299】 2299: [HAOI2011]向量 (乱搞)
2299: [HAOI2011]向量 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1255 Solved: 575 Description 给你一 ...
- [BZOJ4012][HNOI2015]开店(动态点分治,树链剖分)
4012: [HNOI2015]开店 Time Limit: 70 Sec Memory Limit: 512 MBSubmit: 2168 Solved: 947[Submit][Status] ...
- 【BFS】【枚举】HihoCoder - 1251 - The 2015 ACM-ICPC Asia Beijing Regional Contest - C - Today Is a Rainy Day
题意:给你两个只由1~6组成的串,问你B串至少要经过几次操作变成A串. 一次操作要么选择一个种类的数,将其全部变成另一种类:要么选择一个数,将其变为另一个数. 可以证明,一定先进行一定数量的第一种操作 ...