- 浏览: 13632398 次
- 性别:
- 来自: 洛杉矶
文章分类
- 全部博客 (1994)
- Php / Pear / Mysql / Node.js (378)
- Javascript /Jquery / Bootstrap / Web (435)
- Phone / IOS / Objective-C / Swift (137)
- Ubuntu / Mac / Github / Aptana / Nginx / Shell / Linux (335)
- Perl / Koha / Ruby / Markdown (8)
- Java / Jsp (12)
- Python 2 / Wxpython (25)
- Codeigniter / CakePHP (32)
- Div / Css / XML / HTML5 (179)
- WP / Joomla! / Magento / Shopify / Drupal / Moodle / Zimbra (275)
- Apache / VPN / Software (31)
- AS3.0/2.0 / Flex / Flash (45)
- Smarty (6)
- SEO (24)
- Google / Facebook / Pinterest / SNS (80)
- Tools (22)
最新评论
-
1455975567:
xuezhongyu01 写道wocan23 写道我想问下那个 ...
Mysql: LBS实现查找附近的人 (两经纬度之间的距离) -
xuezhongyu01:
wocan23 写道我想问下那个111.1是怎么得来的我也看不 ...
Mysql: LBS实现查找附近的人 (两经纬度之间的距离) -
18335864773:
试试 pageoffice 在线打开 PDF 文件吧. pag ...
jquery在线预览PDF文件,打开PDF文件 -
青春依旧:
opacity: 0.5; 个人喜欢这种方式!关于其他css特 ...
css透明度的设置 (兼容所有浏览器) -
July01:
推荐用StratoIO打印控件,浏览器和系统的兼容性都很好,而 ...
搞定网页打印自动分页问题
关联:iOS中XML解析 (二) libxml2(实例:打印xml内容及存储到数组)
在时间上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的代码文件头部,加入:
#import "TBXML.h"
来源: http://www.61ic.com/Mobile/iPhone/201108/36543.html
使用说明:
.h
#import <UIKit/UIKit.h> #import "TBXML.h" @interface SecondViewController : UIViewController { TBXML *tbxml; NSMutableArray *articles; } - (void) loadURL; - (void) loadXMLString; - (void) loadXMLData; - (void) loadArticles; - (void) loadUnknownXML; - (void) traverseElement:(TBXMLElement *)element; @end
.m
- (void)viewDidLoad { [self loadURL]; [self loadArticles]; // 打印xml内容,以及存储内容到数组中 [self loadXMLString]; [self loadXMLData]; [self loadUnknownXML]; [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. } - (void)loadURL { // Load and parse an xml string tbxml = [[TBXML alloc] initWithURL:[NSURL URLWithString:@"http://feeds.feedburner.com/IbtimescomWorld?format=xml"]]; // If TBXML found a root node, process element and iterate all children if (tbxml.rootXMLElement) [self traverseElement:tbxml.rootXMLElement]; // release resources tbxml = nil; } - (void)loadArticles { // Load and parse an xml string tbxml = [[TBXML alloc] initWithURL:[NSURL URLWithString:@"http://feeds.feedburner.com/IbtimescomWorld?format=xml"]]; //tbxml = [TBXML tbxmlWithXMLFile:@"books.xml"]; TBXMLElement *root = tbxml.rootXMLElement; if (root) { TBXMLElement *channel = [TBXML childElementNamed:@"channel" parentElement:root]; if (channel) { articles = [NSMutableArray array]; TBXMLElement *item = [TBXML childElementNamed:@"item" parentElement:channel]; while (item) { TBXMLElement *title = [TBXML childElementNamed:@"title" parentElement:item]; TBXMLElement *link = [TBXML childElementNamed:@"link" parentElement:item]; TBXMLElement *description = [TBXML childElementNamed:@"description" parentElement:item]; TBXMLElement *date = [TBXML childElementNamed:@"pubDate" parentElement:item]; //NSLog(@"\n title => %@",[TBXML textForElement:title]); NSDictionary *newsItem = [NSDictionary dictionaryWithObjectsAndKeys: [TBXML textForElement:title], @"title", [TBXML textForElement:link], @"link", [TBXML textForElement:description], @"desc", [TBXML textForElement:date], @"date", nil]; [articles addObject:newsItem]; item = [TBXML nextSiblingNamed:@"item" searchFromElement:item]; } } } for(int i=0;i<[articles count];i++) { NSLog(@"%@",[articles objectAtIndex:i]); } tbxml = nil; } - (void)loadXMLString { // Load and parse an xml string tbxml = [[TBXML alloc] initWithXMLString:@"<root><elem1 attribute1=\"elem1-attribute1\"/><elem2 attribute2=\"attribute2\"/></root>"]; // If TBXML found a root node, process element and iterate all children if (tbxml.rootXMLElement) [self traverseElement:tbxml.rootXMLElement]; // release resources tbxml = nil; } - (void)loadXMLData { // Load and parse an NSData object NSString * xmlString = @"<root><elem1 attribute1=\"elem1-attribute1\"/><elem2 attribute2=\"attribute2\"/></root>"; NSData * xmlData = [xmlString dataUsingEncoding:NSASCIIStringEncoding]; tbxml = [[TBXML alloc] initWithXMLData:xmlData]; // If TBXML found a root node, process element and iterate all children if (tbxml.rootXMLElement) [self traverseElement:tbxml.rootXMLElement]; // release resources tbxml = nil; } - (void)loadUnknownXML { // Load and parse the books.xml file tbxml = [[TBXML alloc] initWithXMLFile:@"books" fileExtension:@"xml"]; // If TBXML found a root node, process element and iterate all children if (tbxml.rootXMLElement) [self traverseElement:tbxml.rootXMLElement]; // release resources tbxml = nil; } - (void) traverseElement:(TBXMLElement *)element { do { // Display the name of the element NSLog(@"%@",[TBXML elementName:element]); // Obtain first attribute from element TBXMLAttribute * attribute = element->firstAttribute; // if attribute is valid while (attribute) { // Display name and value of attribute to the log window NSLog(@"%@->%@ = %@",[TBXML elementName:element],[TBXML attributeName:attribute], [TBXML attributeValue:attribute]); // Obtain the next attribute attribute = attribute->next; } // if the element has child elements, process them if (element->firstChild) [self traverseElement:element->firstChild]; // Obtain next sibling element } while ((element = element->nextSibling)); }
如果你关闭了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)
- 下载次数: 131
- TBXML-Books.zip (54.1 KB)
- 下载次数: 98
- KissXML-5.0-0-g8256048.zip (94.2 KB)
- 下载次数: 40
- TouchCode-TouchXML-0.1-NonARC-1-g540e643.zip (1.1 MB)
- 下载次数: 35
- tinyxml_2_6_2.zip (284.1 KB)
- 下载次数: 31
- GDataXML.zip (15.2 KB)
- 下载次数: 64
发表评论
-
手机firebug查看网页代码 How to View Website Source Codes on iPad / iPhone
2016-04-26 02:41 1122You’re using your iPad to br ... -
Android模拟器genymotion的安装和使用
2016-03-18 01:16 2471Genymotion概述 Genymotion是一套完整的 ... -
编码之道:取个好名字很重要
2015-10-14 05:19 1119代码就是程序员的孩子,给“孩子”取个好听的名字很重 ... -
Genymotion - 强大好用高性能的 Android 模拟器 (在电脑流畅运行APK安卓软件游戏的利器)
2015-06-05 13:34 7323随着 Android 系统的应用和游戏越来越丰富,甚至有 ... -
收集几个移动平台浏览器的User-Agent
2014-07-23 02:33 2976List of all Mobile Browsers ... -
常用浏览器修改User-Agent的方法
2014-06-28 02:58 10905之前有介绍收集的几个移动平台浏览器的User-Agent,以 ... -
更简洁的方式修改Chrome的User Agent,轻松体验移动版网络
2014-06-28 02:53 6869国庆节在家宅着,使用3g上网卡上网,和在公司上网不一样的是 ... -
3个检测浏览器User-Agent信息的网站
2014-06-28 02:52 2498刚刚在收集各个移动平台浏览器的User-Agent(参见这 ... -
根据移动设备屏幕像素密度,给予不同分辨率的图片
2014-06-26 00:52 2909在出现iphone4之前的相当长的时间内,网站开发人员 ... -
视网膜New iPad与普通分辨率iPad页面的兼容处理
2014-06-26 00:44 1274一、这是篇经验分享 ... -
iOS8开发-Swift编程
2014-06-25 00:45 1827课时列表 章节1:第一个Swift应用 ... -
Swift中文教程(二十三) 高级运算符
2014-06-25 00:43 783除了基本操作符中所讲的运算符,Swift还有许多复杂的高级 ... -
Swift中文教程(二十二) 泛型
2014-06-25 00:35 1005泛型代码可以让你写出根据自我需求定义、适用于任何类型的,灵 ... -
Swift中文教程(二十一) 协议
2014-06-24 05:25 1012Protocol(协议)用于统一方法和属性的名称,而不实现任 ... -
Swift中文教程(二十) 扩展
2014-06-24 00:47 685扩展就是向一个已有的类、结构体或枚举类型添加新功能(fun ... -
Swift中文教程(十九) 类型嵌套
2014-06-24 00:44 886枚举类型常被用于实现特定类或结构体的功能。也能够在有多种变量 ... -
Swift中文教程(十八) 类型检查
2014-06-24 00:41 724类型检查是一种检查类实例的方式,并且或者也是让实例作为它的 ... -
Swift中文教程(十七) 可选链
2014-06-17 05:11 864可选链(Optional Chaining)是一种可以请求 ... -
Swift中文教程(十六) 自动引用计数
2014-06-17 05:05 1245Swift使用自动引用计数(ARC)来管理应用程序的内存使 ... -
Swift中文教程(十五) 析构
2014-06-17 04:57 997在一个类的实例被释放之前,析构函数会被调用。用关键字dei ...
相关推荐
iOS xml 解析 本来是喜欢用json的,可服务端的那位大神居然搞不出来 他说他是直接返回一串字符串的,是底层给疯装成xml返回的 嗨,累 网上搜了下,有说用sdk自带的NSXMLParse, 有说用google提供的GDataXML, 还有...
TBXML, 超快速,轻量,易于使用的Mac & iOS的XML解析器 什么是 TBXMLTBXML是一个轻量级的XML文档解析器,用 objective-c 设计,用于苹果 iPad,iPhone & iPod ( 。Mac OSX兼容) 触发器。 TBXML旨在提供最快的XML解析...
该demo中描述了2种解析模式,一是苹果自带的,二是TBXMl解析,代码中注释相当的详细啊,如果TBXML解析 有问题 请对照我博客ios xml解析,上面写得相当清楚
ios xml解析 NSXMLParser。 NSXMLParser是基于SAX的解析方式。NSXMLParser采用了委托设计模式,因此他的实现类需要采用协议并支持委托。NSXMLParser解析XML需要委托NSXMLParserDelegate实现。
在iPhone开发中,XML的解析有很多选择,iOS SDK提供了NSXMLParser和libxml2两个类库,另外还有很多第三方类库可选,例如TBXML、TouchXML、KissXML、TinyXML和GDataXML。问题是应该选择哪一个呢? 解析 XML 通常有两...
tbxml-android: 版本 1.00.0TBXML - Android NDK 端口tbxml-android是 TBXML XML 解析库(适用于 iOS)到 Android NDK 的端口。 它适用于那些偶尔需要 SAX 解析器的速度和 DOM 的便利性并且可以使用非常简单的 XML ...
GDataXML,TinyXML,KissXML,TouchXML,TBXML多种xml解析例子,不多说需要的自己下来看看吧!
解析的是开源中国的最近动弹的内容,ASIHTTP发送请求,NSXML解析出结果,只是打印出来数据,还没有对其处理。开源中国项目中用的是TBXML第三方解析的数据。
之前XML解析的托展,这次用的是TBXML的第三方解析的。(可能服务器问题,获取的数据有错,但方法是没问题的) 然后用IconDownloader异步加载得到的图片流。
此文件有意从 .gitignore 中的存储库中排除,以便 API 密钥不会添加到存储库中。 项目中有一个 Configuration-example.plist 文件,显示了 Configuration.plist 文件的格式。 请使用适当的 API 密钥和 URL 创建一个...
异步加载图片,之前的版本发现还是有问题,这次做了修改.上次忘记初始化,犯一低级错误。不好意思
大厅灯目录TBXML我用来解析XML的外部库color_picker iOS前端hall_lights Arduino素描硬件Eagle CAD文件点亮ConnectPort X2的Python源以实现服务器