如何给你iOS项目选择最合适的XML解析方式

2024-03-15 21:48

本文主要是介绍如何给你iOS项目选择最合适的XML解析方式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

XML也许是我们储存数据和通讯数据中最常见的一种简易方式,当我们来到XML的海洋时,我们会发现当我们用iPhone程序解析XML时,我们是有如此多的选项,让人眼花缭乱。iOS SDK本身就带有两种不同的解析库可以使用,除此之外还有很多很受欢迎的第三方的库,比如说 TBXML, TouchXML, KissXML, TinyXML, 和 GDataXML,我们究竟如何选择呢?真是个问题。

 

XMLPerformance Test App Extended For 3rd Party Libraries

我通过拓展苹果官方的 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查询。

 

好了,下面我们就开始比较这些库的性能

检测一下各种解析方式的性能吧

 

XML Parser Stats Display in Test App

 

苹果官方提供了一个非常好的示例程序,解析一个大概900KB大,包括itunes排名前300的歌曲的XML文档。

 

最好的方法是你下载下来自己看看,这个App就是图中所示的界面

下载性能测试程序源码 

下面我们来看看测试的结果

XML解析器性能大比拼

 

这是我实机测试的数据:

Parsing Time By Parser

很明显,NSXMLParser是最慢的,TBXML是最快的,这是由于TBXML的功能是最少的。

 

其实看到DOM解析器运行比SAX快对于来说也是很奇怪的,后来我搞懂了不停地比较字符串需要不停地停止后继续,导致速度变慢。

 

我还制作了他们使用内存峰值的图表

 

Memory Usage By Parser

 

可以看出DOM的解析方式通常比SAX的解析方式需要使用更多的内存。

 

最后,我们来总结一下这些解析器的的综合状况和区别:

 NSXMLlibxml2 – SAXTBXMLTouchXMLKissXMLTinyXMLGDataXMLlibxml2 – DOM
Included with SDK?YesYesNoNoNoNoNoYes
Seconds to Parse1.871.190.681.11.371.271.070.84
Peak Memory Usage3.113.013.076.55.254.84.154.97
Parse While Downloading?NoYesNoNoNoNoNoNo
Edit/Save XML?NoNoNoNoYesYesYesYes
XPath Support?NoNoNoYesYesYes*YesYes
C or Obj-CObj-CCObj-CObj-CObj-CCObj-CC
LicenseAppleMITMITMITMITZLibApacheMIT

那究竟选哪个呢?

 

究竟选哪一个解析器取决于你想要让这个解析器干些什么事情:

  • 如果你读取的是很小的文件的话,小文件的读取并不会影响任何性能,所以你应该使用即是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


这篇关于如何给你iOS项目选择最合适的XML解析方式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/813372

相关文章

gradle第三方Jar包依赖统一管理方式

《gradle第三方Jar包依赖统一管理方式》:本文主要介绍gradle第三方Jar包依赖统一管理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录背景实现1.顶层模块build.gradle添加依赖管理插件2.顶层模块build.gradle添加所有管理依赖包

Linux之systemV共享内存方式

《Linux之systemV共享内存方式》:本文主要介绍Linux之systemV共享内存方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、工作原理二、系统调用接口1、申请共享内存(一)key的获取(二)共享内存的申请2、将共享内存段连接到进程地址空间3、将

Maven中引入 springboot 相关依赖的方式(最新推荐)

《Maven中引入springboot相关依赖的方式(最新推荐)》:本文主要介绍Maven中引入springboot相关依赖的方式(最新推荐),本文给大家介绍的非常详细,对大家的学习或工作具有... 目录Maven中引入 springboot 相关依赖的方式1. 不使用版本管理(不推荐)2、使用版本管理(推

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

C#使用StackExchange.Redis实现分布式锁的两种方式介绍

《C#使用StackExchange.Redis实现分布式锁的两种方式介绍》分布式锁在集群的架构中发挥着重要的作用,:本文主要介绍C#使用StackExchange.Redis实现分布式锁的... 目录自定义分布式锁获取锁释放锁自动续期StackExchange.Redis分布式锁获取锁释放锁自动续期分布式

Golang HashMap实现原理解析

《GolangHashMap实现原理解析》HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持高效的插入、查找和删除操作,:本文主要介绍GolangH... 目录HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持

Java对象转换的实现方式汇总

《Java对象转换的实现方式汇总》:本文主要介绍Java对象转换的多种实现方式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Java对象转换的多种实现方式1. 手动映射(Manual Mapping)2. Builder模式3. 工具类辅助映

Spring Boot读取配置文件的五种方式小结

《SpringBoot读取配置文件的五种方式小结》SpringBoot提供了灵活多样的方式来读取配置文件,这篇文章为大家介绍了5种常见的读取方式,文中的示例代码简洁易懂,大家可以根据自己的需要进... 目录1. 配置文件位置与加载顺序2. 读取配置文件的方式汇总方式一:使用 @Value 注解读取配置方式二

Python使用getopt处理命令行参数示例解析(最佳实践)

《Python使用getopt处理命令行参数示例解析(最佳实践)》getopt模块是Python标准库中一个简单但强大的命令行参数处理工具,它特别适合那些需要快速实现基本命令行参数解析的场景,或者需要... 目录为什么需要处理命令行参数?getopt模块基础实际应用示例与其他参数处理方式的比较常见问http

JAVA保证HashMap线程安全的几种方式

《JAVA保证HashMap线程安全的几种方式》HashMap是线程不安全的,这意味着如果多个线程并发地访问和修改同一个HashMap实例,可能会导致数据不一致和其他线程安全问题,本文主要介绍了JAV... 目录1. 使用 Collections.synchronizedMap2. 使用 Concurren