用TBXML解析XML数据


 1.Tree-based API:这种API的处理方式是将XML的结构看成是树,然后把树的各部分看成一个对象来处理,这就是我们说的DOM (Document Object Model)方式。在iPhoneSDK里包含了一个libxml2的框架(Framework)就能进行DOM解析方式。GoogleGDataXML也是基于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 plain copy
  1. xml version="1.0" encoding="UTF-8"?>  
  2.   
  3.   
  4. <oschina>  
  5.     <software>  
  6.                                                                                                                                                                                                                                                                                                 <id>15655id>  
  7.         <title>title>  
  8.         <url>url>  
  9.         <extensionTitle>extensionTitle>  
  10.         <license>license>  
  11.         <body>pre {white-space:pre-wrap;word-wrap:break-word;}

    一个用C++实现的 中文句法分析 工具包,采用的是中文宾州树库标准(Chinese Tree Bank),并提供源代码。 可以对原始的文档(GBK编码)进行自动繁简转换,分句,分词,词性标注,依存句法分析。

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

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

     
     
  14. 参考文献:

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

     
     
  16. [2] Xian Qian, Qi Zhang, Xuangjing Huang and Lide Wu. "2D Trie for fast parsing ", COLING 2010

    ]]>
    body>  
  17.         <homepage>homepage>  
  18.         <document>document>  
  19.         <download>download>  
  20.         <logo>logo>  
  21.         <language>language>  
  22.         <os>os>  
  23.         <recordtime>recordtime>  
  24.         <favorite>0favorite>  
  25.         <tweetCount>1tweetCount>  
  26.             software>  
  27. <notice>  
  28.     <atmeCount>0atmeCount>  
  29.     <msgCount>0msgCount>  
  30.     <reviewCount>0reviewCount>  
  31.     <newFansCount>0newFansCount>  
  32. notice>  
  33. oschina>  
我需要把数据解析出来。生成一个Software对象,代码如下:

[objc]  view plain copy
  1. + (Software *)readStrSoftwareDetail:(NSString *)str  
  2. {  
  3. #warning TBXML解析xml对象的方法。  
  4.     debugLog(@"%@",str);  
  5.     //初始化  
  6.     TBXML *xml = [[TBXML alloc] initWithXMLString:str error:nil];  
  7.     TBXMLElement *root = xml.rootXMLElement;//得到根路径  
  8.     //root目录下得soft目录  
  9.     TBXMLElement *soft = [TBXML childElementNamed:@"software" parentElement:root];  
  10.     if (soft == nil) {  
  11.         return nil;  
  12.     }  
  13.     //soft目录下得_id目录  
  14.     TBXMLElement *_id = [TBXML childElementNamed:@"id" parentElement:soft];  
  15.     //soft目录下得title目录  
  16.     TBXMLElement *title = [TBXML childElementNamed:@"title" parentElement:soft];  
  17.     if (!title) {  
  18.         return nil;  
  19.     }  
  20.     //soft目录下得extensionTitle目录,并把值存入extensionTitle  
  21.     TBXMLElement *extensionTitle = [TBXML childElementNamed:@"extensionTitle" parentElement:soft];  
  22.     TBXMLElement *license = [TBXML childElementNamed:@"license" parentElement:soft];  
  23.     TBXMLElement *body = [TBXML childElementNamed:@"body" parentElement:soft];  
  24.   
  25.     TBXMLElement *homePage = [TBXML childElementNamed:@"homepage" parentElement:soft];  
  26.     TBXMLElement *document = [TBXML childElementNamed:@"document" parentElement:soft];  
  27.     TBXMLElement *download = [TBXML childElementNamed:@"download" parentElement:soft];  
  28.       
  29.     TBXMLElement *logo = [TBXML childElementNamed:@"logo" parentElement:soft];  
  30.     TBXMLElement *language = [TBXML childElementNamed:@"language" parentElement:soft];  
  31.     TBXMLElement *os = [TBXML childElementNamed:@"os" parentElement:soft];  
  32.     TBXMLElement *recordTime = [TBXML childElementNamed:@"recordtime" parentElement:soft];  
  33.     TBXMLElement *fav = [TBXML childElementNamed:@"favorite" parentElement:soft];  
  34.     TBXMLElement *tweetCount=[TBXML childElementNamed:@"tweetCount" parentElement:soft];  
  35.     //把相应的值初始化为一个Software对象  
  36.     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]];  
  37.       
  38.     return s;  
  39. }  

你可能感兴趣的:(iOS,TBXML,xml解析)