微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

用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 theW3CXML spec 1.0should 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

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

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

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

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

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

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

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

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

id)tbxmlWithXMLData:(NSData*)aData;

id)tbxmlWithXMLFile:(Nsstring*)aXMLFile;

Nsstring*)aXMLFile fileExtension:(Nsstring*)aFileExtension;


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

id)initWithXMLString:(id)initWithXMLData:(id)initWithXMLFile:(

@end

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

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

@interfaceTBXML (StaticFunctions)

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

Nsstring*) textForElement:(Nsstring*) valueOfAttributeNamed:(Nsstring*)aName forElement:(Nsstring*) attributeName:(TBXMLAttribute*)aXMLAttribute;

Nsstring*) attributeValue:( + (TBXMLElement*) nextSiblingNamed:(Nsstring*)aName searchfromElement:(TBXMLElement*) childElementNamed:(Nsstring*)aName parentElement:(TBXMLElement*)aParentXMLElement;

@end


下面是我的一个使用例子:

网络返回xml数据如下:

[html] view plain copy
  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <oschina>
  3. softwareid>15655</title><![CDATA[ctbparser]]>url<![CDATA[http://www.oschina.net/p/ctbparser]]>extensionTitle<![CDATA[中文句法分析器]]>license<![CDATA[LGPL]]>body<![CDATA[<styletype='text/css'>pre{white-space:pre-wrap;word-wrap:break-word;}</style><p>一个用C++实现的中文句法分析工具包,采用的是中文宾州树库标准(ChineseTreeBank),并提供源代码。可以对原始的文档(GBK编码)进行自动繁简转换,分句,分词,词性标注,依存句法分析。</p>
  4. <p>该句法分析工具采用了标准的图模型算法,即最大生成树算法(projectiveMaximumSpanningTree)。该算法由Eisner于96年提出,复杂度为句子长度的三次方。详情可参见论文[1]</p>
  5. <p>句法分析目前尚属于研究阶段,离实际应用还有很长的距离。其关键问题在于句法分析速度太慢。远远落后于分词和词性标注,因此无法处理海量数据。正因为这样,本工具包不提供更加耗时的高阶解码算法(Higherorderprojectiveparsing),并采用新的数据结构[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位CentOS5,cpu:Intel(R)Xeon(R)E5405,2.00GHz)<br><br>具体使用说明在工具包readme_cn.html文件中,这里就不提了。</p>
  6. <p>参考文献:</p>
  7. <p>[1]MarkA.Paskin,"Cubic-timeParsingandLearningalgorithmsforGrammaticalBigramModels",techniquereport,2001</p>
  8. <p>[2]XianQian,QiZhang,XuangjingHuangandLideWu."<ahref="http://homepage.fudan.edu.cn/%7Eqzhang/paper/2dtrie.coling2010.pdf"rel="nofollow">2DTrieforfastparsing</a>",COLING2010</p>]]>homepage<![CDATA[http://www.oschina.net/action/project/go?id=15655&p=home]]>document<![CDATA[]]>download<![CDATA[http://www.oschina.net/action/project/go?id=15655&p=download]]>logo<![CDATA[http://www.oschina.net/img/logo/default.gif?t=1377425908000]]>language<![CDATA[C/C++]]>os<![CDATA[跨平台]]>recordtime<![CDATA[2010年10月25日]]>favorite>0tweetCount>1noticeatmeCountmsgCountreviewCountnewFansCount>
我需要把数据解析出来。生成一个Software对象,代码如下:

[objc] view plain copy
  1. +(Software*)readStrSoftwareDetail:(Nsstring*)str
  2. {
  3. #warningTBXML解析xml对象的方法
  4. debugLog(@"%@",str);
  5. //初始化
  6. TBXML*xml=[[TBXMLalloc]initWithXMLString:strerror:nil];
  7. TBXMLElement*root=xml.rootXMLElement;//得到根路径
  8. //root目录下得soft目录
  9. TBXMLElement*soft=[TBXMLchildElementNamed:@"software"parentElement:root];
  10. if(soft==nil){
  11. returnnil;
  12. }
  13. //soft目录下得_id目录
  14. TBXMLElement*_id=[TBXMLchildElementNamed:@"id"parentElement:soft];
  15. //soft目录下得title目录
  16. TBXMLElement*title=[TBXMLchildElementNamed:@"title"if(!title){
  17. }
  18. //soft目录下得extensionTitle目录,并把值存入extensionTitle
  19. TBXMLElement*extensionTitle=[TBXMLchildElementNamed:@"extensionTitle"TBXMLElement*license=[TBXMLchildElementNamed:@"license"TBXMLElement*body=[TBXMLchildElementNamed:@"body"
  20. TBXMLElement*homePage=[TBXMLchildElementNamed:@"homepage"TBXMLElement*document=[TBXMLchildElementNamed:@"document"TBXMLElement*download=[TBXMLchildElementNamed:@"download"TBXMLElement*logo=[TBXMLchildElementNamed:@"logo"TBXMLElement*language=[TBXMLchildElementNamed:@"language"TBXMLElement*os=[TBXMLchildElementNamed:@"os"TBXMLElement*recordTime=[TBXMLchildElementNamed:@"recordtime"TBXMLElement*fav=[TBXMLchildElementNamed:@"favorite"TBXMLElement*tweetCount=[TBXMLchildElementNamed:@"tweetCount"//把相应的值初始化为一个Software对象
  21. Software*s=[[SoftwareinitWithParemters:[[TBXMLtextForElement:_id]intValue]andTitle:[TBXMLtextForElement:title]andExtension:[TBXMLtextForElement:extensionTitle]andLicense:[TBXMLtextForElement:license]andBody:[TBXMLtextForElement:body]andHomepage:[TBXMLtextForElement:homePage]andDocument:[TBXMLtextForElement:document]andDownload:[TBXMLtextForElement:download]andlogo:[TBXMLtextForElement:logo]andLanguage:[TBXMLtextForElement:language]andOS:[TBXMLtextForElement:os]andRecordTime:[TBXMLtextForElement:recordTime]andFavorite:[[TBXMLtextForElement:fav]intValue]==1addTweetCount:[[TBXMLtextForElement:tweetCount]intValue]];
  22. returns;
  23. }

原文地址:https://www.jb51.cc/xml/296866.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。