如何选择最佳的XML解析器为您的iPhone项目

jopen 11年前

有很多选择,当谈到关于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解析器的性能比较应用

XML教程适用于iOS:如何选择最佳的XML解析器为您的iPhone项目

苹果已经取得了被称为XMLPerformance一个极好的代码示例,可以让你比较它需要解析包含有两个NSXML和libxml2的API的前300名iTunes的歌曲〜900KB的XML文档的时间。

该示例允许您选择一个分析方法,然后解析文档,并将其保存在了多长时间下载的文件,并解析该文件在数据库中的统计数据。 那么你可以去统计屏幕上看到的平均下载和解析时间为每个方法。

我想这将是测试出如何将这些不同的API对对方进行一种理想的方式,所以我扩展了样本,以包括上述所有库。 如果你想尝试一下您的设备上,你可以下载下面的更新项目。 它也可作为如何使用上述每个API的一个很好的例子!

下载更新XMLPerformance项目

该项目的说明:如果库包含XPath的支持,我用了一个单一的查询,因为我觉得它代表了库将在实践中的使用方式。 但当然XPath是一般不是通过树手动行走速度较慢,所以把它添加到基准这些库。

所以无论如何 - 我将讨论如何使用示例我的设备上执行这里的东西写成,是结果 - 但随时给它一个镜头您的设备上,或调整的基础上,实际的XML数据,您需要将代码解析!

XML解析器的性能比较

下面是一些图表,显示了如何快速的各种解析器解析XML文档我的装置(iPhone 3Gs的)上:

XML教程适用于iOS:如何选择最佳的XML解析器为您的iPhone项目

正如你可以在这里看到,的NSXMLParser是迄今为止最慢的方法。 TBXML是最快的,这是有道理的,因为很多功能被剔除,以优化分析时为只读。

我很惊讶,但是,看到TBXML和其他一些DOM解析方法进行比libxml2的SAX解析器,我原以为会是最快所有的方法更快。 我没有异形,但我的猜测,为什么它是慢是因为频繁的字符串进行比较需要解析文档中的SAX方法。

然而,不打折的libxml2的SAX方法,通过看这个图。 请记住,libxml2的是这些方法,可以解析文档,因为它是阅读的只有一个 - 所以它可以让你的应用程序开始显示数据的时候了,而不是让下载完成第一。

好吧,这里有一个图表,显示由解析器(这是通过通过对象分配工具运行的各种方法获得)的峰值内存使用:

XML教程适用于iOS:如何选择最佳的XML解析器为您的iPhone项目

请注意,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 。