本内容来自英文贴的翻译,原文链接。欢迎指正批评
分析一个xml文件,有很多的方法,iPhone SDK为我们有两个不同的类供我们选择另外还有很多的第三方类比如TBXML, TouchXML, KissXML, TinyXML, 和 GDataXML等,但是作为开发者,我们就如何选择呢?
我最近查看了很相关的信息,并且也从扩展了苹果的XMLPerformance的示例。尝试着去了解各种顶层的操作类是如何工作,并比较它们的最终表现。我想我应该把我从中所学习到的东西分享给那些目前仍在寻找着iPhone项目中最好的xml的分析方法的人。
在本文中,我们将会给出一个这些最流行的iPhone类的具体成绩和特点。并讲解在它们之中应如何做出选择。同时,也会提供一个示例来展示如何应用这些顶层类来读取xml数据。
一、SAX 与 DOM
在开始之前,我必须保证每个人都能理解这两个非常重要的xml分析方法的区别:
SAX解释器:是当接收到你的代码的事件通知时,它会遍历xml树,然后你就负责跟踪这个遍历的状态和构建对象,你可能会在分析器遍历的过程中跟踪数据。 SAX是一个用于处理XML事件驱动的“推”模型,虽然它不是W3C标准,但它却是一个得到了广泛认可的API。SAX解析器不像DOM那样建立一个完整的文档树,而是在读取文档时激活一系列事件,这些事件被推给事件处理器,然后由事件处理器提供对文档内容的访问。
DOM解释器:文档对象模型,DOM可以以一种独立于平台和语言的方式访问和修改一个文档的内容和结构。换句话说,这是表示和处理一个HTML或XML文档的常用方法。通常,你甚至可以构建特定的查询原则来提取信息块
二、iPhone中应用最流行的xml解释器
在我的研究中,以下这些是我个人认为iPhone中应用最为流行的xml解释器。它们的简单介绍如下:
- NSXMLParser :是SAX解释器的一种,它是iPhone SDK中自带的,它可以相当直接地应用于Objective-c中,不过可能前没有DOM模式那样快速。
- libxml2 :是一个开源的类,它默认包含于iPhone SDK,它是一个基于C的API,所以应用赶来相对于NSXML会繁琐一点。这个类同时支持DOM与SAX处理。llibxml2 SAX处理是一种很酷的处理方式,因为它的特点是在数据被计入的同时就能够被解释。比如,对于一个大型的xml文件,你可以一边从网络上下载,一边显示信息到用户终端。
- TBXML:是一种轻型的DOM解释器,它被设计成一种尽可以快速而少占用内存的解释器。保存是它没有验证,不支持XPath,而且是只读的。比如:你可以用它来读取xml,但是你不能用它来修改或再次写入文件。
- TouchXML:是iPhone中的一种NSXML风格的DOM解释器,它也是只读性的,但是不象TBXML那样,不支持XPath。
- KissXML :是iPhone中的另外一种NSSXML风格的解释器,实现上它是基于TouchXML的,它们最大的区别在于KissXML同时支持XML的读入、编辑和写入操作。
- TinyXML:基于C的一种小型DOM解释器,它只包含了四个C文件和两个头文件。它同时支持XML的读写操作,但是它自身并不支持XPath,尽管如此,你也可以使用一个相关的类——TinyXPath来达到相应的目的。
- GDataXML:也是iPhone中的另外一种NSXML风格的DOM解释器。由谷歌开发来作为他们的Objective-C委托类,仅包含一个m文件和一个头文件。它支持读写xml文件的操作,也支持XPath。
好了,现在我们来开始比较啦:
三、XML解释器成绩比较程序
苹果自己做了一个很优秀的代码示例叫XMLPerformance,它可以让你来对比NSXML和libxml2解释一个约900KB的xml文件(包含iTunes歌曲前300)的时间。
这个示例允许你选择一个解释方法然后再解释文件,而且可以保持至你从数据库中下载并解释完所有文件。你可以返回到统计界面去查看各个方法平均的下载和解释时间。
我想这是个评测这些API的理想方式,因些我扩展了这个示例,让它包含了以上的所有操作类。如果你想在你的机器上测试一下,你可以在以下连接上下载或更新这个项目。当然要学会如何应用这些API,它也是个很好的示例。
项目札记:如果类是支持了XPath,那么我会使用它做单一检索,因为这种方法意味着,这个类会在实际中被应用到。当然,XPath一般来说会比 手工遍历树要慢,所以它也做为了这些类的一个基准。
好了,接下来我们要讨论一下,这些API在我的机器上的运行结果,不过这个是自由的,你可以试一下,在你的设备上运行,也可以根据解析XML的实际需要尝试修改一些代码。
四、XML解释运行对比
这些图表显示了这些解释器在我的设备(iPhone 3Gs)对xml文件的解释速度。
从上表看来,目前为止NSXML解释器是最慢的,TBXML 是最快的。这点也是合理的,因为它有一些特点就是专门为了完善”解释只读“速度而做的。
我还是感到惊讶,无论怎么说,我们可以看到的是:TBXML和其他一些DOM解释器的API都运行得比libxml2快,我本以为libxml2应该是最快的。我无法解释清楚原因。不过我猜它的慢应该是因为SAX方法需要频繁的string对比。
不管怎么说,不再讨论libxml2的SAX方法了,记得libxml2一唯一一个可以边下载边解释xml文档的方法。而不像其他方法要等到下载完才能进行解释。
好了,下面是一个解释器的顶峰内存消耗图表
注意,DOM方法常常需要消耗比SAX更多的内存。当我们处理特别大的xml文件时,这是一我们要留意一的一点,给iPhone上加一个内存限制。
我们还注意到libxml2在么内存消耗峰值方面控制得最好(我估计它的架构也是比别人做得好的)。
最后,让我们就这些图表来做一个统计吧,总结一下这些解释方法的不同点。
NSXML | libxml2 – SAX | TBXML | TouchXML | KissXML | TinyXML | GDataXML | libxml2 – DOM | |
---|---|---|---|---|---|---|---|---|
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 |
* = with TinyXPath
五、应该如何选择
选择那种xml解释解释器,就根据你要使用它做些什么来做决定。
如果你只是想要读取小型的xml文件,小文件操作的运行不会有什么大的区别。你可能会需要XPath来收集一些东西,或者要使用objective-C来保证你工作更加上手,那我比较推荐的是:TouchXML, KissXML,或GDataXML;
如果你想能够同时支持读写小型的xml文件,如上,性能仍然不是问题。你可能会需要XPath来收集一些东西、或者要使用objective-C、读写支持。所以我推荐KissXML or GDataXML;
如果你想要读取特大型的xml文件,那么性能是一个很重要的问题。你可以根据实现情况考虑 libxml2 SAX, TBXML, 或 libxml DOM。
六、上文没有提到的几点:
- NSXML:如果你要处理一些小型文件,它是个不错的选择,而且你不会感觉到好像是在加入了第三类到了SDK中。
- TinyXML:如果你对API有一定的经验并且喜欢使用C语言,那么对于中型的文件来说,它还是可以的。因为他的接口很容易应用到iPhone上。
另外在这次的研究过程中,我也看了另外两种XML操作类(VTD-XML和Objective-XML),但是我无法让它们正常运行起来,如果有哪位有幸成功地调用了它们,请尽管扩展它们到示例工程中。
七、何去何从?
如果你正在寻找着一些关于应用这些类的帮助,请查看我的另外一篇贴子How to Read and Write XML Documents with GDataXML.