首页 > 代码库 > 用TBXML解析XML数据
用TBXML解析XML数据
总的来说,iphone 上可用的解析XML的方式大概有2种类型的。
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
按着以上两个分类的话,算是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数据如下:
<?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://www.mamicode.com/"http://homepage.fudan.edu.cn/%7Eqzhang/paper/2dtrie.coling2010.pdf" rel="nofollow">2D Trie for fast parsing ", COLING 2010]]>