如何选择最佳的XML解析器为您的iPhone项目
有很多选择,当谈到关于iPhone的XML解析。 iPhone SDK中配有两个不同的库可供选择,并有可用的几种流行的第三方库,例如TBXML,TouchXML,KissXML,TinyXML的,和GDataXML。 如何为开发人员选择最佳的XML解析器为他们的项目?
我最近已经采取了看看各个选项在那里,并最终延长苹果的XMLPerformance样品试用上述各图书馆,了解他们是如何工作的,并比较它们的性能。 我想我会分享我所学到迄今他人谁可能是为寻找他们的iPhone项目的最佳XML库。
在这个XML教程中,我们将给予的功能和最流行的iPhone图书馆性能的详细比较,解释如何在它们之间进行选择,并给予说明如何使用上述各库来读取XML数据的示例项目。
SAX与DOM
在我们开始之前,我想确保每个人都意识到XML解析器之间最重要的区别:解析器是否是一个SAX或DOM解析器。
- SAX解析器是一个地方你的代码被通知作为解析器在XML树中散步,而你是负责保持状态的跟踪,构建你 可能想通过跟踪数据作为解析器游行的任何对象。
- A A DOM解析器读取整个文件,并建立一个在内存中的表示,你可以为不同的元素进行查询。 通常情况下,你甚至可以构建XPath查询退出特别件。
好了,现在让我们讨论一些库!
最流行的XML解析器的iPhone
在我的研究,这里就是在我看来是最流行的XML解析器的iPhone,而且每一个简要说明:
- 的NSXMLParser是默认包含在iPhone SDK中的SAX解析器。 这是写在Objective-C和非常简单的使用,但也许不太一样的DOM模型容易。
- libxml2的是默认包含在iPhone SDK中的开源库。 这是一个基于C的API,所以有点更多的工作比使用NSXML。 该库同时支持DOM和SAX处理。 在libxml2的SAX处理器是特别爽,因为它具有能够分析数据,因为它是被读取一个独特的功能。 例如,您可以从网络读取大型XML文档并显示数据,您正在阅读它给用户,而你还在下载。
- TBXML是一个轻量级的DOM XML解析器设计,同时消耗很少的内存资源是尽可能快。 它节省了时间不进行验证,不支持XPath和由被只读 - 即你可以读取XML有了它,但是你不能再修改XML中并重新写回。
- TouchXML是NSXML风格的DOM XML解析器的iPhone。 像TBXML,它也是只读的,但不像TBXML它支持XPath的。
- KissXML是另一个NSSXML风格的DOM XML解析器的iPhone,实际上是基于TouchXML。 主要的区别是KissXML还支持编辑和编写XML以及阅读。
- TinyXML的是一个小型的基于C语言的DOM的XML解析器,只包含4个C文件和两个头。 它同时支持读取和写入XML文档,但是它不支持的XPath自身。 但是,您可以使用相关的库 - TinyXPath - 为。
- GDataXML是另一个NSXML风格的DOM XML解析器的iPhone,谷歌通过他们的Objective-C的客户端库的一部分开发的。 只是由一个M档和一个头,它同时支持读取和编写XML文档和XPath查询。
好了,现在让我们开始比较所有这些库!
XML解析器的性能比较应用
苹果已经取得了被称为XMLPerformance一个极好的代码示例,可以让你比较它需要解析包含有两个NSXML和libxml2的API的前300名iTunes的歌曲〜900KB的XML文档的时间。
该示例允许您选择一个分析方法,然后解析文档,并将其保存在了多长时间下载的文件,并解析该文件在数据库中的统计数据。 那么你可以去统计屏幕上看到的平均下载和解析时间为每个方法。
我想这将是测试出如何将这些不同的API对对方进行一种理想的方式,所以我扩展了样本,以包括上述所有库。 如果你想尝试一下您的设备上,你可以下载下面的更新项目。 它也可作为如何使用上述每个API的一个很好的例子!
该项目的说明:如果库包含XPath的支持,我用了一个单一的查询,因为我觉得它代表了库将在实践中的使用方式。 但当然XPath是一般不是通过树手动行走速度较慢,所以把它添加到基准这些库。
所以无论如何 - 我将讨论如何使用示例我的设备上执行这里的东西写成,是结果 - 但随时给它一个镜头您的设备上,或调整的基础上,实际的XML数据,您需要将代码解析!
XML解析器的性能比较
下面是一些图表,显示了如何快速的各种解析器解析XML文档我的装置(iPhone 3Gs的)上:
正如你可以在这里看到,的NSXMLParser是迄今为止最慢的方法。 TBXML是最快的,这是有道理的,因为很多功能被剔除,以优化分析时为只读。
我很惊讶,但是,看到TBXML和其他一些DOM解析方法进行比libxml2的SAX解析器,我原以为会是最快所有的方法更快。 我没有异形,但我的猜测,为什么它是慢是因为频繁的字符串进行比较需要解析文档中的SAX方法。
然而,不打折的libxml2的SAX方法,通过看这个图。 请记住,libxml2的是这些方法,可以解析文档,因为它是阅读的只有一个 - 所以它可以让你的应用程序开始显示数据的时候了,而不是让下载完成第一。
好吧,这里有一个图表,显示由解析器(这是通过通过对象分配工具运行的各种方法获得)的峰值内存使用:
请注意,DOM方法通常需要比SAX的方法(除了TBXML,这确实是相当有效率的)更多的内存开销。 这一点,当你正在处理的特别大的文档来考虑,鉴于在iPhone上的内存限制。
还要注意的是libxml2的的SAX方法是最好的选择,据峰值内存使用量而言(我怀疑它会规模比别人更好的为好)。
最后,让我们换了一个图表,总结了解析器和一切我们上面已经讨论之间的差异:
NSXML | libxml2的 - SAX | TBXML | TouchXML | KissXML | TinyXML的 | GDataXML | libxml2的 - DOM | |
---|---|---|---|---|---|---|---|---|
附带的SDK? | 是的 | 是的 | 无 | 无 | 无 | 无 | 无 | 是的 |
秒的解析 | 1.87 | 1.19 | 0.68 | 1.1 | 1.37 | 1.27 | 1.07 | 0.84 |
峰值内存使用量 | 3.11 | 3.01 | 3.07 | 6.5 | 5.25 | 4.8 | 4.15 | 4.97 |
解析虽然下载? | 无 | 是的 | 无 | 无 | 无 | 无 | 无 | 无 |
编辑/保存XML? | 无 | 无 | 无 | 无 | 是的 | 是的 | 是的 | 是的 |
XPath的支持? | 无 | 无 | 无 | 是的 | 是的 | 有* | 是的 | 是的 |
C或对象 - | OBJ-C | Ç | OBJ-C | OBJ-C | OBJ-C | Ç | OBJ-C | Ç |
许可证 | 苹果 | 麻省理工学院 | 麻省理工学院 | 麻省理工学院 | 麻省理工学院 | 的ZLib | 阿帕奇 | 麻省理工学院 |
* =与TinyXPath
选择哪一个?
其中的XML解析器来选择实际上取决于你想要做的解析器什么。
- 如果你只是想读小XML文档 ,性能并不重要一样多的小文件。 你可能想捡东西使用XPath的支持,而且是写在Objective-C中,使您的工作更轻松一些。 所以我建议要么TouchXML,KissXML,或GDataXML这种情况。
- 如果你想读取和写入小XML文档 ,再次表现并不重要不亚于功能性和易用性。 你可能想捡东西与XPath的支持,写在Objective-C,具有读/写能力。 所以我建议KissXML或GDataXML这种情况。
- 如果你想阅读非常大的XML文档 ,性能是最关键的问题在这里。 你要考虑libxml2的SAX的,TBXML,或的libxml的DOM对于这一点,这取决于您的具体情况。
那么那些我没有提到?
- NSXML是,如果你正在处理的比较小的文件,一个体面的选择,你不觉得像增加一个第三方库的SDK。
- TinyXML的可能是中等大小的文件一个确定的选择,如果您已经拥有了API的经验,并熟悉C,因为它的端口很容易地超过了iPhone。
我这次调查(VTD-XML和目标,XML)的过程中,看了看另外两个XML库,但我不能让他们的工作。 如果别人已经有更多的运气有了这些,随意延长示例项目,包括他们!
凡要何去何从?
如果你正在寻找使用这些库中的一个一定的帮助,看看我的帖子如何读取和编写XML文档与GDataXML 。