您的位置:首页 > 其它

用TBXML解析XML数据

2015-04-28 11:05 330 查看
1.Tree-based API:这种API的处理方式是将XML的结构看成是树,然后把树的各部分看成一个对象来处理,这就是我们说的DOM
(Document Object Model)方式。在iPhone的SDK里包含了一个libxml2的框架(Framework)就能进行DOM解析方式。Google的GDataXML也是基于libxml2的,因此在使用GDataXML之前,你需要先导入libxml2。

2.Event-driven API:这种方式通常用于解析基于的事件,SAX解析方式就是这种解析方式的代表。在iPhone开发的,也可以利用这种方式来解析XML,不过这可不是Iphone
SDK的属性啊,而是Objective-C的功能。在Objectvie-C种有专门解析XML的类NSXMLParser。

r TBXML are:

XML files conforming to the W3C XML
spec 1.0 should be passable

XML parsing should incur the fewest possible resources

XML parsing should be achieved in the shortest possible time

It shall be easy to write programs that utilise TBXML

Design Goals

Check out this post for a good comparison of XML parsers. “How
To Chose The Best XML Parser for Your iPhone Project”

Performance

TBXML.zip

TBXML-Books.zip

Version changes

介绍一种轻量级的XML解析方式,TBXML。

按着以上两个分类的话,算是DOM 的解析方式。需要去找寻root 节点。然后按着名字顺序查找。找到某个节点之后,如果需要找寻孩子信息,那么使用这个节点做为parent,继续向里面查找。

正如他的官方介绍所说TBXML 具有如下特点:

速度快,效率高,占用的额外资源少。耗时短。

本人看来,用起来确实方便。上手容易,快速。

常用的初始化方式有。如下几种。

+ (id)tbxmlWithURL:(NSURL*)aURL;

+ (id)tbxmlWithXMLString:(NSString*)aXMLString;

+ (id)tbxmlWithXMLData:(NSData*)aData;

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

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

- (id)initWithURL:(NSURL*)aURL;

- (id)initWithXMLString:(NSString*)aXMLString;

- (id)initWithXMLData:(NSData*)aData;

- (id)initWithXMLFile:(NSString*)aXMLFile;

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

@end

静态方法也不过7种而已。

=======================================================================================

@interface TBXML (StaticFunctions)

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

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

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

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

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

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

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

@end

下面是我的一个使用例子:
网络返回xml数据如下:

[html] view
plaincopy

<?xml version="1.0" encoding="UTF-8"?>

<oschina>

<software>

<id>15655</id>

<title><![CDATA[ctbparser]]></title>

<url><![CDATA[http://www.oschina.net/p/ctbparser]]></url>

<extensionTitle><![CDATA[中文句法分析器]]></extensionTitle>

<license><![CDATA[LGPL]]></license>

<body><![CDATA[<style type='text/css'>pre {white-space:pre-wrap;word-wrap:break-word;}</style><p>一个用C++实现的 中文句法分析 工具包,采用的是中文宾州树库标准(Chinese Tree Bank),并提供源代码。 可以对原始的文档(GBK编码)进行自动繁简转换,分句,分词,词性标注,依存句法分析。</p>

<p>该句法分析工具采用了标准的图模型算法,即最大生成树算法(projective Maximum Spanning Tree)。该算法由Eisner于96年提出,复杂度为句子长度的三次方。详情可参见论文[1]</p>

<p>句法分析目前尚属于研究阶段,离实际应用还有很长的距离。其关键问题在于句法分析速度太慢。远远落后于分词和词性标注,因此无法处理海量数据。正因 为这样,本工具包不提供更加耗时的高阶解码算法(Higher order projective parsing),并采用新的数据结构[2],在无损精度的前提下,提高句法分析的速度。<strong><br> <br> 系统框架:</strong> <br> 整个句法分析分为5步:<br> 1、繁简、半全角转换并切句:所有繁体字通过一张对应表转成简体字,所有的半角符号转成全角。比如'a'就转成'a'。对转换好的句子,用简单的规则进行切句。<br> 2、命名实体识别:采用条件随机场模型标出句中的人名、地名。<br> 3、分词:采用条件随机场模型进行分词,人名、地名被强制独立成词。此外,采用最短路的方法匹配出字典中的词。<br> 4、词性标注:采用条件随机场模型进行词性标注,字典匹配出的词,其词性和字典一致。<br> 5、句法分析:采用最优生成树算法,对句子进行句法分析。<br> <br> <strong>评测:</strong> <br> 在CTB6标准测试集上,ctbparser分词得到95.3% F1值,词性标注精度94.27%,句法分析精度81%。处理速度(包括分词、词性标注、句法分析)的速度是每秒30句,内存占用为270M。(操作系 统:64位CentOS 5,CPU: Intel(R) Xeon(R) E5405, 2.00GHz)<br> <br> 具体使用说明在工具包readme_cn.html文件中,这里就不提了。</p>

<p>参考文献:</p>

<p>[1] Mark A. Paskin, "Cubic-time Parsing and Learning Algorithms for Grammatical Bigram Models", technique report, 2001</p>

<p>[2] Xian Qian, Qi Zhang, Xuangjing Huang and Lide Wu. "<a href="http://homepage.fudan.edu.cn/%7Eqzhang/paper/2dtrie.coling2010.pdf" rel="nofollow">2D Trie for fast parsing</a> ", COLING 2010</p>]]></body>

<homepage><![CDATA[http://www.oschina.net/action/project/go?id=15655&p=home]]></homepage>

<document><![CDATA[]]></document>

<download><![CDATA[http://www.oschina.net/action/project/go?id=15655&p=download]]></download>

<logo><![CDATA[http://www.oschina.net/img/logo/default.gif?t=1377425908000]]></logo>

<language><![CDATA[C/C++]]></language>

<os><![CDATA[跨平台]]></os>

<recordtime><![CDATA[2010年10月25日]]></recordtime>

<favorite>0</favorite>

<tweetCount>1</tweetCount>

</software>

<notice>

<atmeCount>0</atmeCount>

<msgCount>0</msgCount>

<reviewCount>0</reviewCount>

<newFansCount>0</newFansCount>

</notice>

</oschina>

我需要把数据解析出来。生成一个Software对象,代码如下:

[objc] view
plaincopy

+ (Software *)readStrSoftwareDetail:(NSString *)str

{

#warning TBXML解析xml对象的方法。

debugLog(@"%@",str);

//初始化

TBXML *xml = [[TBXML alloc] initWithXMLString:str error:nil];

TBXMLElement *root = xml.rootXMLElement;//得到根路径

//root目录下得soft目录

TBXMLElement *soft = [TBXML childElementNamed:@"software" parentElement:root];

if (soft == nil) {

return nil;

}

//soft目录下得_id目录

TBXMLElement *_id = [TBXML childElementNamed:@"id" parentElement:soft];

//soft目录下得title目录

TBXMLElement *title = [TBXML childElementNamed:@"title" parentElement:soft];

if (!title) {

return nil;

}

//soft目录下得extensionTitle目录,并把值存入extensionTitle

TBXMLElement *extensionTitle = [TBXML childElementNamed:@"extensionTitle" parentElement:soft];

TBXMLElement *license = [TBXML childElementNamed:@"license" parentElement:soft];

TBXMLElement *body = [TBXML childElementNamed:@"body" parentElement:soft];

TBXMLElement *homePage = [TBXML childElementNamed:@"homepage" parentElement:soft];

TBXMLElement *document = [TBXML childElementNamed:@"document" parentElement:soft];

TBXMLElement *download = [TBXML childElementNamed:@"download" parentElement:soft];

TBXMLElement *logo = [TBXML childElementNamed:@"logo" parentElement:soft];

TBXMLElement *language = [TBXML childElementNamed:@"language" parentElement:soft];

TBXMLElement *os = [TBXML childElementNamed:@"os" parentElement:soft];

TBXMLElement *recordTime = [TBXML childElementNamed:@"recordtime" parentElement:soft];

TBXMLElement *fav = [TBXML childElementNamed:@"favorite" parentElement:soft];

TBXMLElement *tweetCount=[TBXML childElementNamed:@"tweetCount" parentElement:soft];

//把相应的值初始化为一个Software对象

Software *s = [[Software alloc] initWithParemters:[[TBXML textForElement:_id] intValue] andTitle:[TBXML textForElement:title] andExtension:[TBXML textForElement:extensionTitle] andLicense:[TBXML textForElement:license] andBody:[TBXML textForElement:body] andHomepage:[TBXML textForElement:homePage] andDocument:[TBXML textForElement:document] andDownload:[TBXML textForElement:download] andLogo:[TBXML textForElement:logo] andLanguage:[TBXML textForElement:language] andOS:[TBXML textForElement:os] andRecordTime:[TBXML textForElement:recordTime] andFavorite:[[TBXML textForElement:fav] intValue] == 1 addTweetCount:[[TBXML textForElement:tweetCount] intValue]];

return s;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: