在时间上TBXML占优,libxml2支持了边下载边解析。

来源:http://www.codeios.com/forum.php?mod=viewthread&tid=9880&highlight=xml

解析 XML 通常有两种方式,DOM 和 SAX:

DOM解析XML时,读入整个XML文档并构建一个驻留内存的树结构(节点树),通过遍历树结构可以检索任意XML节点,读取它的属性和值。而且通常情况下,可以借助XPath,直接查询XML节点。

SAX解析XML,是基于事件通知的模式,一边读取XML文档一边处理,不必等整个文档加载完之后才采取操作,当在读取解析过程中遇到需要处理的对象,会发出通知对其进行处理。

一般在iOS平台下,比较常用的XML解析类库有如下几种:

NSXMLParser,这是一个SAX方式解析XML的类库,默认包含在iOS SDK中,使用也比较简单。

libxml2,是一套默认包含在iOS SDK中的开源类库,它是基于C语言的API,所以使用起来可能不如NSXML方便。这套类库同时支持DOM和SAX解析,libxml2的SAX解析方式还是非常酷的,因为它可以边读取边解析,尤其是在从网上下载一个很大的XML文件,就可以一边下载一边对已经下载好的内容进行解析,极大的提高解析效率。

TBXML,这是一套轻量级的DOM方式的XML解析类库,有很好的性能和低内存占用,不过它不对XML格式进行校验,不支持XPath,并且只支持解析,不支持对XML进行修改。

TouchXML,这也是一套DOM方式的XML解析类库,支持XPath,不支持XML的修改。

KissXML,这是一套基于TouchXML的XML解析类库,和TouchXML相比,支持了XML的修改。

TinyXML,这是一套小巧的基于C语言的DOM方式进行XML解析的类库,支持对XML的读取和修改,不直接支持XPath,需要借助另一个相关的类库TinyXPath才可以支持XPath。

GDataXML,这是一套Google开发的DOM方式XML解析类库,支持读取和修改XML文档,支持XPath方式查询。

那么对于如何在项目中选择合适的XML解析类库呢?网上已经有人对这几款XML类库做过分析和对比,可参考《How To Choose The Best XML Parser for Your iPhone Project》 一文,基本比较准确和客观,文中建议:

如果是读取很小的XML文档,性能基本上没有什么差别,不过从调用的方便性来说,建议使用TouchXML、KissXML或GDataXML

如果是需要读取和修改XML文档,建议使用KissXML或GDataXML

如果需要读取非常大的XML文档,则建议使用libxml2或TBXML

如果你不想去调用第三方类库,那么使用NSXML也可以

TBXML

1. 解压TBXML.zip后,将包含TBXML.h, TBXML.m, NSDataAdditions.h和NSDataAddtions.m四个文件的文件夹拖到项目中

2. 添加对libz.dylib类库的应用 (项目=>Build Phases=>Link Binary With Libraries=>+=>libz.dylib=>add)

在需要调用TBXML的代码文件头部,加入:

C代码  
  1. #import "TBXML.h"

来源: http://www.61ic.com/Mobile/iPhone/201108/36543.html

使用说明:

.h

C代码  
  1. #import <UIKit/UIKit.h>
  2. #import "TBXML.h"
  3. @interface SecondViewController : UIViewController
  4. {
  5. TBXML *tbxml;
  6. NSMutableArray *articles;
  7. }
  8. - (void) loadURL;
  9. - (void) loadXMLString;
  10. - (void) loadXMLData;
  11. - (void) loadArticles;
  12. - (void) loadUnknownXML;
  13. - (void) traverseElement:(TBXMLElement *)element;
  14. @end

.m

Java代码  
  1. - (void)viewDidLoad
  2. {
  3. [self loadURL];
  4. [self loadArticles]; //  打印xml内容,以及存储内容到数组中
  5. [self loadXMLString];
  6. [self loadXMLData];
  7. [self loadUnknownXML];
  8. [super viewDidLoad];
  9. // Do any additional setup after loading the view, typically from a nib.
  10. }
  11. - (void)loadURL {
  12. // Load and parse an xml string
  13. tbxml = [[TBXML alloc] initWithURL:[NSURL URLWithString:@"http://feeds.feedburner.com/IbtimescomWorld?format=xml"]];
  14. // If TBXML found a root node, process element and iterate all children
  15. if (tbxml.rootXMLElement)
  16. [self traverseElement:tbxml.rootXMLElement];
  17. // release resources
  18. tbxml = nil;
  19. }
  20. - (void)loadArticles {
  21. // Load and parse an xml string
  22. tbxml = [[TBXML alloc] initWithURL:[NSURL URLWithString:@"http://feeds.feedburner.com/IbtimescomWorld?format=xml"]];
  23. //tbxml = [TBXML tbxmlWithXMLFile:@"books.xml"];
  24. TBXMLElement *root = tbxml.rootXMLElement;
  25. if (root)
  26. {
  27. TBXMLElement *channel = [TBXML childElementNamed:@"channel" parentElement:root];
  28. if (channel)
  29. {
  30. articles = [NSMutableArray array];
  31. TBXMLElement *item = [TBXML childElementNamed:@"item" parentElement:channel];
  32. while (item)
  33. {
  34. TBXMLElement *title = [TBXML childElementNamed:@"title" parentElement:item];
  35. TBXMLElement *link = [TBXML childElementNamed:@"link" parentElement:item];
  36. TBXMLElement *description = [TBXML childElementNamed:@"description" parentElement:item];
  37. TBXMLElement *date = [TBXML childElementNamed:@"pubDate" parentElement:item];
  38. //NSLog(@"\n title => %@",[TBXML textForElement:title]);
  39. NSDictionary *newsItem = [NSDictionary dictionaryWithObjectsAndKeys:
  40. [TBXML textForElement:title], @"title",
  41. [TBXML textForElement:link], @"link",
  42. [TBXML textForElement:description], @"desc",
  43. [TBXML textForElement:date], @"date",
  44. nil];
  45. [articles addObject:newsItem];
  46. item = [TBXML nextSiblingNamed:@"item" searchFromElement:item];
  47. }
  48. }
  49. }
  50. for(int i=0;i<[articles count];i++)
  51. {
  52. NSLog(@"%@",[articles objectAtIndex:i]);
  53. }
  54. tbxml = nil;
  55. }
  56. - (void)loadXMLString {
  57. // Load and parse an xml string
  58. tbxml = [[TBXML alloc] initWithXMLString:@"<root><elem1 attribute1=\"elem1-attribute1\"/><elem2 attribute2=\"attribute2\"/></root>"];
  59. // If TBXML found a root node, process element and iterate all children
  60. if (tbxml.rootXMLElement)
  61. [self traverseElement:tbxml.rootXMLElement];
  62. // release resources
  63. tbxml = nil;
  64. }
  65. - (void)loadXMLData {
  66. // Load and parse an NSData object
  67. NSString * xmlString = @"<root><elem1 attribute1=\"elem1-attribute1\"/><elem2 attribute2=\"attribute2\"/></root>";
  68. NSData * xmlData = [xmlString dataUsingEncoding:NSASCIIStringEncoding];
  69. tbxml = [[TBXML alloc] initWithXMLData:xmlData];
  70. // If TBXML found a root node, process element and iterate all children
  71. if (tbxml.rootXMLElement)
  72. [self traverseElement:tbxml.rootXMLElement];
  73. // release resources
  74. tbxml = nil;
  75. }
  76. - (void)loadUnknownXML {
  77. // Load and parse the books.xml file
  78. tbxml = [[TBXML alloc] initWithXMLFile:@"books" fileExtension:@"xml"];
  79. // If TBXML found a root node, process element and iterate all children
  80. if (tbxml.rootXMLElement)
  81. [self traverseElement:tbxml.rootXMLElement];
  82. // release resources
  83. tbxml = nil;
  84. }
  85. - (void) traverseElement:(TBXMLElement *)element {
  86. do {
  87. // Display the name of the element
  88. NSLog(@"%@",[TBXML elementName:element]);
  89. // Obtain first attribute from element
  90. TBXMLAttribute * attribute = element->firstAttribute;
  91. // if attribute is valid
  92. while (attribute) {
  93. // Display name and value of attribute to the log window
  94. NSLog(@"%@->%@ = %@",[TBXML elementName:element],[TBXML attributeName:attribute], [TBXML attributeValue:attribute]);
  95. // Obtain the next attribute
  96. attribute = attribute->next;
  97. }
  98. // if the element has child elements, process them
  99. if (element->firstChild) [self traverseElement:element->firstChild];
  100. // Obtain next sibling element
  101. } while ((element = element->nextSibling));
  102. }

如果你关闭了ARC,请替换 tbxml = nil; 为 [tbxml release];

如果你开启了ARC,会有类似“arc forbids explicit message send of ...”这样的错误,那么你需要转换一下:

Edit => Refactor => Convert to Objective-C ARC...

其实就是把 NSDataAdditions.m 中的 [result autorelease] 替换成 return result;

或者干脆关闭ARC,方法为:打开当前工程,打开"Build Settings",找到Objective-C Automatic Reference Counting项,将它的值设置为NO。

本实例为ARC开启

全部API为:

http://www.tbxml.co.uk/TBXML/API.html

方法

1.实例化

+ (id)tbxmlWithXMLFile:(NSString*)aXMLFile;

用xml文件名(包括扩展名)实例化一个tbxml对象

例如:TBXML * tbxml = [[TBXML alloc] initWithXMLFile:@”books.xml”];

- (id)initWithXMLFile:(NSString*)aXMLFile fileExtension:(NSString*)aFileExtension

用xml文件名和扩展名实例化一个tbxml对象

例如:TBXML * tbxml = [[TBXML alloc] initWithXMLFile:@”books” fileExtension:@”xml”];

- (id)initWithXMLString:(NSString*)aXMLString

用一段xml内容代码来实例化一个tbxml对象

例如:tbxml = [[TBXML alloc] initWithXMLString:@”<root><elem1 attribute1=”elem1 attribute1″/><elem2 attribute2=”elem2 attribute2″/></root>;”];

- (id)initWithXMLData:(NSData*)aData

用一个封装了xml内容的NSData对象来实例化tbxml对象

例如:TBXML * tbxml = [[TBXML alloc] initWithXMLData:myXMLData];

- (id)initWithURL:(NSURL*)aURL

用一个URL来实例化一个tbxml

例如:tbxml = [[TBXML alloc] initWithURL:[NSURL URLWithString:@"http://www.ifanr.com/feed"]];

2.成员方法

+ (TBXMLElement*) childElementNamed:(NSString*)aName parentElement:(TBXMLElement*)aParentXMLElement

获得aParentXMLElement元素的首个名字为aName的元素

例如:TBXMLElement * author = [TBXML childElementNamed:@"author" parentElement:rootXMLElement];

+ (TBXMLElement*) nextSiblingNamed:(NSString*)aName searchFromElement:(TBXMLElement*)aXMLElement

返回下一个名为aName的兄弟元素

例如:TBXMLElement * author = [TBXML nextSiblingNamed:@"author" searchFromElement:author];

+ (NSString*) valueOfAttributeNamed:(NSString *)aName forElement:(TBXMLElement*)aXMLElement

返回aXMLElement元素中,名为aName的属性的属性值。

例如:NSString * authorName = [TBXML valueOfAttributeNamed:@"name" forElement:authorElement];

+ (NSString*) textForElement:(TBXMLElement*)aXMLElement

返回元素aXMLElement的text值

例如:NSString * bookDescription = [TBXML textForElement:bookElement];

+ (NSString*) elementName:(TBXMLElement*)aXMLElement;

返回元素aXMLElement的标签名

例如:NSString * elementName = [TBXML elementName:element];

+ (NSString*) attributeName:(TBXMLAttribute*)aXMLAttribute;

返回属性aXMLAttribute的属性名

例如:NSString * attributeName = [TBXML attributeName:attribute];

+ (NSString*) attributeValue:(TBXMLAttribute*)aXMLAttribute;

返回属性aXMLAttribute的属性值

例如:NSString * attributeValue = [TBXML attributeValue:attribute];

常用的基本就这些,通过合理的迭代,递归等组合调用,基本可以解决所有的解析问题。

关联:iOS中XML解析 (二) libxml2(实例:打印xml内容及存储到数组)

  • TBXML.zip (11.5 KB)
  • 下载次数: 81
  • TBXML-Books.zip (54.1 KB)
  • 下载次数: 69
  • KissXML-5.0-0-g8256048.zip (94.2 KB)
  • 下载次数: 33
  • TouchCode-TouchXML-0.1-NonARC-1-g540e643.zip (1.1 MB)
  • 下载次数: 29
  • tinyxml_2_6_2.zip (284.1 KB)
  • 下载次数: 26
  • GDataXML.zip (15.2 KB)
  • 下载次数: 43

iOS中XML解析汇总相关推荐

  1. iOS中XML解析 (二) libxml2(实例:打印xml内容及存储到数组)

    关联:iOS中XML解析 (一) TBXML (实例:打印xml内容及存储到数组) 关于libxml库的基本使用,在http://xmlsoft.org/网上有文档. 准备工作: project=&g ...

  2. iOS中XML解析 (一) TBXML (实例:打印xml内容及存储到数组)

    关联:iOS中XML解析 (二) libxml2(实例:打印xml内容及存储到数组) 在时间上TBXML占优,libxml2支持了边下载边解析. 来源:http://www.codeios.com/f ...

  3. iOS 中 XML 数据交换格式

         XML 是一种自描述的数据交换格式,但是 XML 的数据交换格式并没有 JSON 来的轻便,但是无可否认的是,XML 的应用范围也是非常广泛的,比如在 ROS(一个开源机器人操作系统)中利用 ...

  4. 关于Android中XML解析方式

    XML解析一般有三种方式:DOM .SAX.PULL. SAX解析器:它是一种基于事件的解析器,它的核心是事件处理模式,主要是围绕着事件源以及事件处理器来工作.当事件源产生事件后,调用事件处理器相应的 ...

  5. android 中xml解析方式

    2019独角兽企业重金招聘Python工程师标准>>> XML在各种开发中都广泛应用,Android也不例外.作为承载数据的一个重要角色,如何读写XML成为Android开发中一项重 ...

  6. Java中Xml解析详解 DOM、SAX、JDOM、DOM4J

    1.1 什么是XML 一种表示结构化信息的标准方法,以使计算机能够方便地使用此类信息,并且人们可以非常方便地编写和理解这些信息.XML 是 eXtensible Markup Language(可扩展 ...

  7. python中xml解析sax_python使用SAX解析xml

    python 标准库包含SAX解析器,SAX用事件驱动模型,通过在解析XML的过程中触发一个个的事件并调用用户定义的回调函数来处理XML文件 在python中使用sax方式处理xml要先引入xml.s ...

  8. iOS - OC - XML 解析 - NSXMLParser

    //4.解析数据//4.1 创建XML解析器:SAXNSXMLParser *parser = [[NSXMLParser alloc]initWithData:data];//4.2 设置代理par ...

  9. IOS中Json解析的四种方法

    2019独角兽企业重金招聘Python工程师标准>>> 作为一种轻量级的数据交换格式,json正在逐步取代xml,成为网络数据的通用格式. 有的json代码格式比较混乱,可以使用此& ...

最新文章

  1. RESTFUL框架-网站即软件
  2. python 单元测试_聊聊 Python 的单元测试框架(一):unittest
  3. 为你的程序添加监听器
  4. iOS中几种定时器 - 控制了时间,就控制了一切
  5. 写给初中级前端工程师的进阶指南
  6. unity json解析IPA后续
  7. firewallD卸载Linux,在Ubuntu 18.04/16.04系统上安装和使用Firewalld的方法
  8. php 字符符转整数
  9. Visual Studio注释快捷键
  10. jssip中文开发文档(完整版)
  11. matlab人口数据,matlab中国人口
  12. 【Photoshop】常用快捷键记录—持续记录
  13. 蓝桥幼儿园(蓝桥杯)
  14. 汉初百年儒家士人与地方社会
  15. java:获取两个日期相隔天数
  16. 分销与供应链电子元器件采购需要掌握哪些基础知识?
  17. QtVirtualKeyboard 虚拟键盘美化
  18. pip执行指令后报语法错误sys.stderr.write(f”ERROR: {exc}”)解决办法
  19. 基于Gin开发的系统代码生成器
  20. c语言谷歌的招聘题目扣分,google的环环相扣招聘试题

热门文章

  1. 芯片工程师成长之路_实施工程师的成长之路 | 来自咸职厚溥17级学姐的分享
  2. oracle vertica性能对比,测试Vertica性能
  3. php 请求url没有扩展名,apache – 将.php重定向到无扩展名,并在没有.php的情况下创建url...
  4. java语音开源_号外!号外!百度语音开源库更新了
  5. arcgis几何修复有作用吗_ArcGis拓扑的那些事儿(拓扑应用过程二)
  6. pythonappend用法_python中append实例用法总结
  7. Codeforces 920E-Connected Components? (set,补图,连通块)
  8. SQL Server 数据库的统计查询
  9. dataTables去掉搜索框,每页多少条框体,解决Cannot reinitialise DataTable问题,以及数据格式ajax等问题...
  10. jquery-data的三种用法