关联: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 stringtbxml = [[TBXML alloc] initWithURL:[NSURL URLWithString:@"http://feeds.feedburner.com/IbtimescomWorld?format=xml"]];// If TBXML found a root node, process element and iterate all childrenif (tbxml.rootXMLElement)[self traverseElement:tbxml.rootXMLElement];// release resourcestbxml = nil;
}- (void)loadArticles {// Load and parse an xml stringtbxml = [[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 stringtbxml = [[TBXML alloc] initWithXMLString:@"<root><elem1 attribute1=\"elem1-attribute1\"/><elem2 attribute2=\"attribute2\"/></root>"];// If TBXML found a root node, process element and iterate all childrenif (tbxml.rootXMLElement)[self traverseElement:tbxml.rootXMLElement];// release resourcestbxml = nil;
}- (void)loadXMLData {// Load and parse an NSData objectNSString * 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 childrenif (tbxml.rootXMLElement)[self traverseElement:tbxml.rootXMLElement];// release resourcestbxml = nil;
}- (void)loadUnknownXML {   // Load and parse the books.xml filetbxml = [[TBXML alloc] initWithXMLFile:@"books" fileExtension:@"xml"];// If TBXML found a root node, process element and iterate all childrenif (tbxml.rootXMLElement)[self traverseElement:tbxml.rootXMLElement];// release resourcestbxml = nil;
}- (void) traverseElement:(TBXMLElement *)element {do {// Display the name of the elementNSLog(@"%@",[TBXML elementName:element]);// Obtain first attribute from elementTBXMLAttribute * attribute = element->firstAttribute;// if attribute is validwhile (attribute) {// Display name and value of attribute to the log windowNSLog(@"%@->%@ = %@",[TBXML elementName:element],[TBXML attributeName:attribute], [TBXML attributeValue:attribute]);// Obtain the next attributeattribute = attribute->next;}// if the element has child elements, process themif (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内容及存储到数组)

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

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

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

  2. [iphone]XML 解析 之 TBXML 介绍

    总的来说,iphone 上可用的解析XML的方式大概有2种类型的. 1.Tree-based API:这种API的处理方式是将XML的结构看成是树,然后把树的各部分看成一个对象来处理,这就是我们说的D ...

  3. 用“XML解析开发包Jaxp”对XML文件进行Dom方式的CRUD操作

    IT程序员开发必备-各类资源下载清单,史上最全IT资源,个人收藏总结! package edu.jaxp; import java.io.FileNotFoundException; import j ...

  4. java自带的xml解析_Java自带的XML解析

    JAXP(Java API for XML Processing,意为处理XML的Java API) 解析XML一般有两种方式: 一种是DOM方式:一次性读取XML内容存入内存 优点:能进行各种增删改 ...

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

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

  6. 【转】IOS中Json解析的四种方法

    原文网址:http://blog.csdn.net/enuola/article/details/7903632 作为一种轻量级的数据交换格式,json正在逐步取代xml,成为网络数据的通用格式. 有 ...

  7. ios json包含html,IOS中Json解析的四种方法

    发现自己有很多文档,所以现在整理一下,以防忘了... 作为一种轻量级的数据交换格式,json正在逐步取代xml,成为网络数据的通用格式. 有的json代码格式比较混乱,可以使用此"http: ...

  8. Python解析xml文件,此实例将xml设置为模版(from lxml import etree)

    xml文件(template.xml) <core><template><!-- General information about the template --> ...

  9. java xml开源操作类,xml解析和操作的开源工具项目涵盖java c++ php 等语言

    XML解析器-Xerces    XML操作库-dom4j    XML文档解析器-Digester    J2ME-的XML-解析器-kXML XML解析类库-MXP1    XML解析器-LibX ...

最新文章

  1. 025批量删除mac文件名中的空格
  2. 中国核酸数据库GSA数据提交指南
  3. Windows Azure AppFabric概述
  4. B 站 CEO 的身份证被上传到 GitHub 了?
  5. spring-beans模块分析
  6. as3:sprite作为容器使用时,最好不要指定width,height
  7. 计算机发展英语思维导图,怎样画出英语课文总结思维导图
  8. javacript Function parameters(函数参数)
  9. Spring容器和Spring应用上下文的理解
  10. 实时动作游戏同步方式和传输协议选择
  11. 五个免费数据采集工具网站
  12. 创建一个分布式网络爬虫的故事
  13. 2021普华集团数字经济年度盛典在三亚盛大举行
  14. David I 盛大之行 --关于delphi2010
  15. js 只准输入数字_js 限制input只能输入数字
  16. mini2440LED驱动程序开发
  17. 【Markdown 1】什么是Markdown?怎么用? - Markdown语法个人简述总结(图文)(常用)
  18. 四缸汽油机曲轴及凸轮轴信号生成(基于STM32)
  19. 红米k30 允许调用gpu调试层_记一次APP的so层算法逆向(六)
  20. 这篇数据库设计规范建议,我必须分享给你

热门文章

  1. 字符菱形(信息学奥赛一本通-T1028)
  2. 24 WM配置-策略-入库策略4-定义空存储箱策略L(Next Empty Bin Strategy)
  3. 清理垃圾代码bat_电脑一键清理垃圾图文详解
  4. odbc驱动程序管理器连接未打开_Windows 10 怎么修复 Windows 中的 Wi-Fi 连接问题,我教你...
  5. 双栏模板图片标题无法居中_没想到吧,只用一张图片,你就可以做一份PPT!
  6. C++:VS2019遇到C1083 无法打开包括文件: “opencv2/opencv.hpp”: No such file or directory
  7. 一个可以下载Github指定子文件夹的Chrome插件
  8. vutils.save_image==>将给定的张量保存为图像
  9. torchvision.datasets.ImageFolder使用详解
  10. jQuery基础学习笔记(下)