`
天梯梦
  • 浏览: 13632398 次
  • 性别: Icon_minigender_2
  • 来自: 洛杉矶
社区版块
存档分类
最新评论

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

 
阅读更多

关联: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内容及存储到数组) 

 

分享到:
评论
2 楼 天梯梦 2012-10-17  
mxpasser 写道
正需要呢。。。O(∩_∩)O谢谢

不客气~
1 楼 mxpasser 2012-10-17  
正需要呢。。。O(∩_∩)O谢谢

相关推荐

    ios_XML_解析

    iOS xml 解析 本来是喜欢用json的,可服务端的那位大神居然搞不出来 他说他是直接返回一串字符串的,是底层给疯装成xml返回的 嗨,累 网上搜了下,有说用sdk自带的NSXMLParse, 有说用google提供的GDataXML, 还有...

    TBXML, 超快速,轻量,易于使用的Mac & iOS的XML解析器.zip

    TBXML, 超快速,轻量,易于使用的Mac & iOS的XML解析器 什么是 TBXMLTBXML是一个轻量级的XML文档解析器,用 objective-c 设计,用于苹果 iPad,iPhone & iPod ( 。Mac OSX兼容) 触发器。 TBXML旨在提供最快的XML解析...

    ios xml解析

    该demo中描述了2种解析模式,一是苹果自带的,二是TBXMl解析,代码中注释相当的详细啊,如果TBXML解析 有问题 请对照我博客ios xml解析,上面写得相当清楚

    ios xml解析 NSXMLParser

    ios xml解析 NSXMLParser。 NSXMLParser是基于SAX的解析方式。NSXMLParser采用了委托设计模式,因此他的实现类需要采用协议并支持委托。NSXMLParser解析XML需要委托NSXMLParserDelegate实现。

    iOS开发中常见的解析XML的类库以及简要安装方法

    在iPhone开发中,XML的解析有很多选择,iOS SDK提供了NSXMLParser和libxml2两个类库,另外还有很多第三方类库可选,例如TBXML、TouchXML、KissXML、TinyXML和GDataXML。问题是应该选择哪一个呢? 解析 XML 通常有两...

    tbxml-android:TBXML的Android NDK端口

    tbxml-android: 版本 1.00.0TBXML - Android NDK 端口tbxml-android是 TBXML XML 解析库(适用于 iOS)到 Android NDK 的端口。 它适用于那些偶尔需要 SAX 解析器的速度和 DOM 的便利性并且可以使用非常简单的 XML ...

    iphone,xml多种解析方法

    GDataXML,TinyXML,KissXML,TouchXML,TBXML多种xml解析例子,不多说需要的自己下来看看吧!

    AISHTTP发送请求,NSXML解析XML文件

    解析的是开源中国的最近动弹的内容,ASIHTTP发送请求,NSXML解析出结果,只是打印出来数据,还没有对其处理。开源中国项目中用的是TBXML第三方解析的数据。

    iOS从网络异步加载图片

    之前XML解析的托展,这次用的是TBXML的第三方解析的。(可能服务器问题,获取的数据有错,但方法是没问题的) 然后用IconDownloader异步加载得到的图片流。

    Polldaddy-iOS:这是从 SVN 移出的 Polldaddy iOS 代码,处于最后一个已知良好状态

    此文件有意从 .gitignore 中的存储库中排除,以便 API 密钥不会添加到存储库中。 项目中有一个 Configuration-example.plist 文件,显示了 Configuration.plist 文件的格式。 请使用适当的 API 密钥和 URL 创建一个...

    iOS异步加载图片 (需要至少12个字的名称,过分!)

    异步加载图片,之前的版本发现还是有问题,这次做了修改.上次忘记初始化,犯一低级错误。不好意思

    hall_lights_connectport:XBee上的大厅灯

    大厅灯目录TBXML我用来解析XML的外部库color_picker iOS前端hall_lights Arduino素描硬件Eagle CAD文件点亮ConnectPort X2的Python源以实现服务器

Global site tag (gtag.js) - Google Analytics