XML也许是我们储存数据和通讯数据中最常见的一种简易方式,当我们来到XML的海洋时,我们会发现当我们用iPhone程序解析XML时,我们是有如此多的选项,让人眼花缭乱。iOS SDK本身就带有两种不同的解析库可以使用,除此之外还有很多很受欢迎的第三方的库,比如说 TBXML, TouchXML, KissXML, TinyXML, 和 GDataXML,我们究竟如何选择呢?真是个问题。
我通过拓展苹果官方的 XMLPerformance 示例代码,来考察了各种XML解析器的运行性能,我觉得把这些经验写出来可能会帮助那些对XML解析性能认识的不是很清楚的开发者了解XML解析的性能状况。
事实上,如果你经常使用XML文件来更新你的App中的数据的话,解析的性能就会显得十分重要,20s的解析时间和10s的解析时间绝对是不一样的,相信我。
下面,我们就看看这些解析方式是如何使解析性能发生改变的吧。在最后,还有一个整体的性能测试App下载。
SAX 还是 DOM
在我们开始之前,我想要说明一个XML解析器中的大分类,任何一个解析器,首先你都必须先弄清楚他是一个SAX解析器,还是一个DOM解析器。
- 简单来说,SAX解析器会检测整个XML树形结构,你的代码会控制它在哪里停止,使用哪些数据之类的事情。就是说,SAX可控制性强,占用内存小,适用于提取部分数据。
- 而DOM解析器会检测整个文档并且在内存中生成一个复制品,之后你的任何操作都是在这个复制品中进行的。
好了,现在我们开始讨论解析库。
iPhone平台上最受欢迎的XML解析器
通过调查,我发现下面这些XML解析库是在iOS平台上比较受欢迎的:
- NSXMLParser这是iPhone SDK中自带的Sax解析器,在DOM解析方面较弱,由Objective-C语言编写。
- libxml2这也是iPhone SDK中自带的,是一个开源的库,这是基于C的,所以比NSXML用得更广一些。主要的特性就是可以一边读取一边解析。也就是说,xml文件一边还在下载着,你的程序中已经可以显示里面的内容了。
- TBXML这是一个轻量级的DOM解析器,为了加快DOM方式的解析速度而诞生,不支持XPath,也不能修改XML文件中的内容。
- TouchXML这是一个NSXML类似的DOM解析器,就像TBXML一样,这是只读的,但是却支持XPath查询。
- KissXML这是TouchXML的改进版本,支持读写。
- TinyXML基于C的DOM解析器,体积很小但是支持读写,不支持XPath,但是你可以使用TinyXpath来帮助这个库。
- GDataXML这是谷歌官方开发的Objective-C客户端库的一部分,也是一个NSXML类似的DOM解析器,支持读写和XPath查询。
好了,下面我们就开始比较这些库的性能
检测一下各种解析方式的性能吧
苹果官方提供了一个非常好的示例程序,解析一个大概900KB大,包括itunes排名前300的歌曲的XML文档。
最好的方法是你下载下来自己看看,这个App就是图中所示的界面
下面我们来看看测试的结果
XML解析器性能大比拼
这是我实机测试的数据:
很明显,NSXMLParser是最慢的,TBXML是最快的,这是由于TBXML的功能是最少的。
其实看到DOM解析器运行比SAX快对于来说也是很奇怪的,后来我搞懂了不停地比较字符串需要不停地停止后继续,导致速度变慢。
我还制作了他们使用内存峰值的图表
可以看出DOM的解析方式通常比SAX的解析方式需要使用更多的内存。
最后,我们来总结一下这些解析器的的综合状况和区别:
Included with SDK? | Yes | Yes | No | No | No | No | No | Yes |
Seconds to Parse | 1.87 | 1.19 | 0.68 | 1.1 | 1.37 | 1.27 | 1.07 | 0.84 |
Peak Memory Usage | 3.11 | 3.01 | 3.07 | 6.5 | 5.25 | 4.8 | 4.15 | 4.97 |
Parse While Downloading? | No | Yes | No | No | No | No | No | No |
Edit/Save XML? | No | No | No | No | Yes | Yes | Yes | Yes |
XPath Support? | No | No | No | Yes | Yes | Yes* | Yes | Yes |
C or Obj-C | Obj-C | C | Obj-C | Obj-C | Obj-C | C | Obj-C | C |
License | Apple | MIT | MIT | MIT | MIT | ZLib | Apache | MIT |
那究竟选哪个呢?
究竟选哪一个解析器取决于你想要让这个解析器干些什么事情:
- 如果你读取的是很小的文件的话,小文件的读取并不会影响任何性能,所以你应该使用即是Objective-C写的,又能够支持XPath的,我在这里特别推荐TouchXML, KissXML, 和GDataXML
- 如果你希望使用读写功能,而性能对你来说又不是非常重要的话,我推荐你使用KissXML或者GDataXML 这种功能强大的库。
- 而如果你要读取的XML文件非常大,而性能也很重要的话,你也许就应该考虑libxml2 SAX, TBXML, o或者libxml DOM 了
我没有提到的场景下该用什么?
- 如果你不喜欢第三方库,又在处理比较小的XML文件,NSXML就是你的选择
- TinyXML可以用来处理中等大小的XML文档,如果你喜欢C的话,估计你也会喜欢他。
我也曾经尝试过其他的第三方库,但是都不管用
原文地址: http://www.dasheyin.com/ru_he_gei_ni_ios_xiang_mu_xuan_ze_zui_he_shi_de_xml_jie_xi_fang_shi.html
相关推荐
SHXMLParser 是一个基于 NSXMLParser 构建的易用的 XML 解析器,可转换 XML 数据到 Objective-C 对象。 标签:SHXMLParser
因此XML解析也就成为项目开发中必须掌握的一些基本技能。 本文提供一个XML数据解析类SimpleXMLParser, 该类的特点上将XML数据解析成数据库记录形式,数据解析后保存在NSArray中, 其中数组的每个元素对应一条数据库...
XMLDictionary 提供一种简单的方法实现 iOS 和 Mac OS X 下解析和生成 XML 的方法。XMLDictionary 将 XML 转成 NSDictionary 。
KMXmlParser 用于 iOS 和 Mac OS 的XML 解析器。可以将 XML 数据转换成 NSDictionary 或 NSArray。可以解析 SOAP 响应,可以打开/关闭一个属性的解析。支持 XPath 表达。 标签:KMXmlParser
GDataXML-HTML是基于Google的GDataXML的iOS和OSXHTML / XML解析器。 顾名思义,它增加了对libxml2HTMLparser模块的支持,并使您能够处理未验证的XML或HTML。 因此,您可以使用例如XPath来解析具有合理性能的网站 ...
WHC_DataModelFactoryMac上iOS开发辅助工具,快速把json/xml数据转换生成对应模型类属性,省去麻烦手动创建,提高开发效率。简介高效: 自动把json或者xml字符串自动生成模型类文件内容准确: 避免手工创建模型类的...
iOS开发动手练习小项目##快递查询使用快递100的接口;参考文章:主要技术点:UI布局与样式、查询接口的数据请求、返回数据的解析、数据的呈现##号码归属地查询接口地址:主要技术点:UI布局与样式、查询接口的数据...
这个项目源码是一个XML/HTML的解析器案例,源码GONMarkupParser,GONMarkupParser是一个针对XML/HTML的解析器,能够解析出NSAttributedString(属性字符串)。有需要的同学可以参考使用。
这个项目的目标是允许Swift用户在Swift支持的任何平台上以丰富类型的方式读取,操作和写入musicXML文件。 你好,世界! 让我们构造“你好,世界!” 来自乐谱示例。 此乐曲包含一个小节,其中包含以4/4时间为基础...
读取XML文件,解析为Totalcross并在Linux ARM,iOS,Android等平台上运行。 在这里,我们有第二个任务,名为KnowCodeXML。 KnowcodeXML是一个库,可解释Android XML文件并生成Totalcross屏幕,这些屏幕可在Android...
XMLParser 是一个用于 iOS 的 DOM 的 XML 解析器。 标签:XMLParser
外部Dependency Manager for Unity 总览 Unity的外部依赖关系管理器(EDM4U)(以前称为Play Services解析器/ Jar解析器)旨在供需要... 在Unity项目中集成特定于平台的库(例如Android和iOS)可能很复杂,并且会给Unit
要求iOS 8.0 + / Mac OS X 10.9 + / watchOS 2.0 + / tvOS 9.0+ Xcode 8.0+安装要使用CocoaPods将Ji集成到您的Xcode项目中,请在您的Podfile指定它: use_frameworks!pod 'Ji' , '~> 5.0.0' 然后,运行以下命令: $ ...
WSDL到基于JAX-WS Wsimport的IOS Objective-C和Android Java代码生成器。 ##注意MAX-WS最初是。 (及相关项目: , 和 )是由开发的,2013年起一直保持。由于它的设计和实施非常好,我决定分叉并对其进行升级。功能...
模板基于 hpple XML 解析器构建的从 HTML 到 iOS6 NSAttributedString 的轻量级翻译层: ://github.com/topfunky/hpple 本项目中没有CoreText 代码如果您仍然支持 iOS6 之前的版本(或想要更多功能),您可能需要 。...
通过网络或磁盘等方式,把公钥编码传送给李四,李四接收到张三编码后的公钥,将其解码,李四用张三的公钥加密信息,并发送给李四,张三用自己的私钥解密从李四处收到的信息…… Java利用DES私钥对称加密代码实例 ...
AEXML 用 Swift 编写的适用于 iOS 的简单轻量级 XML 解析器AEXML是一个其中包括三类: 班级描述AEXML元素基类AEXML文档继承自 AEXMLElement AEXML解析器NSXMLParser 的简单包装器这不是强大的全功能 XML 解析器...
该应用程序的 iOS 版本使用 TBXML 来解析 XML 文档,并且由于 TBXML 项目具有实现的 Java 端口,因此从 XPath 转换为 TBXML 非常简单。 快速浏览一下 TBXML Objective-C 实现表明将其移植到 NDK 会很简单,几个小时...
Swift RSS阅读器使用Swift 2,Xcode 7和iOS 9构建RSS Reader演示应用程序。概述基于Swift的RSS阅读器,可将rss feed作为xml从远程服务器加载,并使用NSXMLParser对其进行解析。 解析完成后,它将数据加载到...