iOS开发中常见的解析XML的类库以及简要安装方法
在iphone开发中,xml的解析有很多选择,ios sdk提供了nsxmlparser和libxml2两个类库,另外还有很多第三方类库可选,例如tbxml、touchxml、kissxml、tinyxml和gdataxml。问题是应该选择哪一个呢?
解析 xml 通常有两种方式,dom 和 sax:
dom解析xml时,读入整个xml文档并构建一个驻留内存的树结构(节点树),通过遍历树结构可以检索任意xml节点,读取它的属性和值。而且通常情况下,可以借助xpath,直接查询xml节点。
sax解析xml,是基于事件通知的模式,一边读取xml文档一边处理,不必等整个文档加载完之后才采取操作,当在读取解析过程中遇到需要处理的对象,会发出通知对其进行处理。
一般在ios平台下,比较常用的xml解析类库有如下几种:
nsxmlparser,http://developer.apple.com/library/ios/#documentation/cocoa/reference/foundation/classes/nsxmlparser_class/reference/reference.html ,这是一个sax方式解析xml的类库,默认包含在ios sdk中,使用也比较简单。
libxml2,http://xmlsoft.org/,是一套默认包含在ios sdk中的开源类库,它是基于c语言的api,所以使用起来可能不如nsxml方便。这套类库同时支持dom和sax解析,libxml2的sax解析方式还是非常酷的,因为它可以边读取边解析,尤其是在从网上下载一个很大的xml文件,就可以一边下载一边对已经下载好的内容进行解析,极大的提高解析效率。
tbxml,http://www.tbxml.co.uk/tbxml/tbxml_free.html,这是一套轻量级的dom方式的xml解析类库,有很好的性能和低内存占用,不过它不对xml格式进行校验,不支持xpath,并且只支持解析,不支持对xml进行修改。
touchxml,https://github.com/touchcode/touchxml,这也是一套dom方式的xml解析类库,支持xpath,不支持xml的修改。
kissxml,http://code.google.com/p/kissxml/,这是一套基于touchxml的xml解析类库,和touchxml相比,支持了xml的修改。
tinyxml,http://www.grinninglizard.com/tinyxml/,这是一套小巧的基于c语言的dom方式进行xml解析的类库,支持对xml的读取和修改,不直接支持xpath,需要借助另一个相关的类库tinyxpath才可以支持xpath。
gdataxml,http://code.google.com/p/gdata-objectivec-client/source/browse/trunk/source/xmlsupport/,这是一套google开发的dom方式xml解析类库,支持读取和修改xml文档,支持xpath方式查询。
那么对于如何在项目中选择合适的xml解析类库呢?网上已经有人对这几款xml类库做过分析和对比,可参考《how to choose the best xml parser for your iphone project》http://www.raywenderlich.com/553/how-to-chose-the-best-xml-parser-for-your-iphone-project 一文,基本比较准确和客观,文中建议:
如果是读取很小的xml文档,性能基本上没有什么差别,不过从调用的方便性来说,建议使用touchxml、kissxml或gdataxml
如果是需要读取和修改xml文档,建议使用kissxml或gdataxml
如果需要读取非常大的xml文档,则建议使用libxml2或tbxml
如果你不想去调用第三方类库,那么使用nsxml也可以
安装说明
gdataxml
1. 从http://code.google.com/p/gdata-objectivec-client/downloads/list下载“gdata-objective-c client library.”
2. 解压缩文件,找到source\xmlsupport,并且将其中的gdataxmlnode.h 和 gdataxmlnode.m文件拖到项目中
3. 选中项目,选中“build settings”标签页
4. 将build settings页中,顶部的“basic”标签切换到“all”
5. 找到“paths\header search paths”项,并添加“/usr/include/libxml2”到列表中
6. 找到“linking\other linker flags”项,并添加“-lxml2”到列表中
在需要调用gdataxml的代码文件头部,加入:
touchxml
1. 从https://github.com/touchcode/touchxml下载最新touchxml源码
2. 解压后,将其中的sources目录下的文件和目录都拖到项目中
3. 选中项目,选中“build settings”标签页
4. 将build settings页中,顶部的“basic”标签切换到“all”
5. 找到“paths\header search paths”项,并添加“/usr/include/libxml2”到列表中
6. 找到“linking\other linker flags”项,并添加“-lxml2”到列表中
在需要调用touchxml的代码文件头部,加入:
tbxml
1. 从http://www.tbxml.co.uk/tbxml/tbxml_free.html下载最新tbxml源码
2. 解压后,将其中的tbxml.h, tbxml.m, nsdataadditions.h和nsdataaddtions.m四个文件拖到项目中
3. 添加对libz.dylib类库的应用
在需要调用tbxml的代码文件头部,加入:
使用说明
gdataxml
读取xml文件,并解析成为dom文档对象示例:
nsstring *filepath = [[nsbundle mainbundle] pathforresource:@"test" oftype:@"xml"];
nsdata *xmldata = [[nsmutabledata alloc] initwithcontentsoffile:filepath];
nserror *error;
gdataxmldocument *doc = [[gdataxmldocument alloc] initwithdata:xmldata options:0 error:&error];
if (doc == nil) { return nil; }
nslog(@"%@", doc.rootelement);
[doc release];
[xmldata release];