IOS XML的类型数据的解析

在iPhone开发中,XML的解析有很多选择,iOS SDK提供了NSXMLParser和libxml2两个类库,另外还有很多第三方类库可选,例如TBXML、TouchXML、KissXML、TinyXML和GDataXML。问题是应该选择哪一个呢?

解析 XML 通常有两种方式,DOM 和 SAX:

  • DOM解析XML时,读入整个XML文档并构建一个驻留内存的树结构(节点树),通过遍历树结构可以检索任意XML节点,读取它的属性和值。而且通常情况下,可以借助XPath,直接查询XML节点。
  • SAX解析XML,是基于事件通知的模式,一边读取XML文档一边处理,不必等整个文档加载完之后才采取操作,当在读取解析过程中遇到需要处理的对象,会发出通知对其进行处理。

一般在iOS平台下,比较常用的XML解析类库有如下几种:

安装说明
GDataXML

1. 从http://code.google.com/p/gdata-objectivec-client/downloads/list下载“gdata-objective-c client library.”

2. 解压缩文件,找到Source\XMLSupport,并且将其中的GDataXMLNode.h 和 GDataXMLNode.m文件拖到项目中

3. 选中项目,选中“Build Settings”标签页

4. 将Build Settings页中,顶部的“Basic”标签切换到“All”

5. 找到“Paths\Header Search Paths”项,并添加“/usr/include/libxml2”到列表中

6. 找到“Linking\Other Linker Flags”项,并添加“-lxml2”到列表中

clip_image002

 

在需要调用GDataXML的代码文件头部,加入:

#import “GDataXMLNode.h”

TouchXML

1. 从https://github.com/TouchCode/TouchXML下载最新TouchXML源码

2. 解压后,将其中的Sources目录下的文件和目录都拖到项目中

3. 选中项目,选中“Build Settings”标签页

4. 将Build Settings页中,顶部的“Basic”标签切换到“All”

5. 找到“Paths\Header Search Paths”项,并添加“/usr/include/libxml2”到列表中

6. 找到“Linking\Other Linker Flags”项,并添加“-lxml2”到列表中

在需要调用TouchXML的代码文件头部,加入:

#import “TouchXML.h”

TBXML

1. 从http://www.tbxml.co.uk/TBXML/TBXML_Free.html下载最新TBXML源码

2. 解压后,将其中的TBXML.h, TBXML.m, NSDataAdditions.h和NSDataAddtions.m四个文件拖到项目中

3. 添加对libz.dylib类库的应用

在需要调用TBXML的代码文件头部,加入:

#import “TBXML.h”

使用说明
GDataXML

读取XML文件,并解析成为DOM文档对象示例:

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"xml"];

NSData *xmlData = [[NSMutableData alloc] initWithContentsOfFile:filePath];

NSError *error;

GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:xmlData options:0 error:&error];

if (doc == nil) { return nil; }

NSLog(@"%@", doc.rootElement);

[doc release];

[xmlData release];

转载:http://www.cnblogs.com/dotey/archive/2011/05/11/2042000.html

下面专门介绍谷歌的GdataXml,GdataXml是专门的谷歌解析XML的解析类。就是之前的设置复杂点。

GDataXml 相同标签的多个属性,好多文档都没有介绍获取属性的方法,让我找的好苦啊,必须分享!!!
首先向Frameworks文件中添加libxml2.dylib这个库,而后再Croups & Files 侧边栏中双击我们的工程图标,找到 build 修改两个属性如下:
在Search Paths中 找到Header Search Paths 将其对应的值修改为:/usr/includebxml2
在Linking中找到 Other Linker Flags 对应的值改为:-lxml2
GDataXMLDocument *doc=[[GDataXMLDocument alloc]initWithXMLString:resp*****eBody opti*****:2 error:nil];
if (doc!=nil) {
GDataXMLElement *root=[doc rootElement ];
NSLog(@"--------root's children:--------\n%@", root);
//取出根节点的所有孩子节点
//取出某一个具体节点(body节点)
[returnInfo setObject:[[[root elementsForName:@"db:uid"] objectAtIndex:0] stringValue] forKey:@"snsUserUid"];
[returnInfo setObject:[[[root elementsForName:@"title"]objectAtIndex:0]stringValue] forKey:@"snsNickName"];
[returnInfo setObject:[[[root elementsForName:@"db:location"]objectAtIndex:0]stringValue] forKey:@"snsProvince"];
[returnInfo setObject:[[[[root elementsForName:@"link"] objectAtIndex:2]attributeForName:@"href"] stringValue] forKey:@"snsProfileImageUrl"];
[returnInfo setObject:@"4" forKey:@"snsLandEntrance"];
NSLog(@"%@",[[[root elementsForName:@"link"] objectAtIndex:2]attributes]);
NSLog(@"%@",[[[root elementsForName:@"db:location"]objectAtIndex:0]stringValue]);
}
NSLog(@"returnInforeturnInforeturnInforeturnInforeturnInfo%@",returnInfo);

谷歌的GdataXML支持Xpath语法查询

<?xml version="1.0" encoding="ISO-8859-1"?> <catalog> <cd country="USA"> <title>Empire Burlesque</title> <artist>Bob Dylan</artist> <price>10.90</price> </cd> <cd country="UK"> <title>Hide your heart</title> <artist>Bonnie Tyler</artist> <price>9.90</price> </cd> <cd country="USA"> <title>Greatest Hits</title> <artist>Dolly Parton</artist> <price>9.90</price> </cd> </catalog>

 

定位節點
XML是樹狀結構,類似檔案系統內資料夾的結構,XPath也類似檔案系統的路徑命名方式。不過XPath 是一種模式(Pattern),可以選出 XML檔案中,路徑符合某個模式的所有節點出來。例如要選catalog底下的cd中所有price元素可以用:
/catalog/cd/price   

 
如果XPath的開頭是一個斜線(/)代表這是絕對路徑。如果開頭是兩個斜線(//)表示文件中所有符合模式的元素都會被選出來,即使是處於樹中不同的層級也會被選出來。以下的語法會選出文件中所有叫做cd的元素(在樹中的任何層級都會被選出來):
//cd

 
選擇未知的元素
使用星號(Wildcards,*)可以選擇未知的元素。下面這個語法會選出/catalog/cd 的所有子元素:
/catalog/cd/*

 
以下的語法會選出所有catalog的子元素中,包含有price作為子元素的元素。
/catalog/*/price

 
以下的語法會選出有兩層父節點,叫做price的所有元素。
/*/*/price

 
以下的語法會選擇出文件中的所有元素。
//*

 
要注意的是,想要存取不分層級的元素,XPath語法必須以兩個斜線開頭(//),想要存取未知元素才用星號(*),星號只能代表未知名稱的元素,不能代表未知層級的元素。
 
選擇分支
使用中括號可以選擇分支。以下的語法從catalog的子元素中取出第一個叫做cd的元素。XPath的定義中沒有第0元素這種東西。
/catalog/cd[1]

 
以下語法選擇catalog中的最後一個cd元素:(XPathj並沒有定義 first() 這種函式喔,用上例的 [1]就可以取出第一個元素。
/catalog/cd[last()]

 
以下語法選出含有price子元素的所有/catalog/cd元素。
/catalog/cd[price]

 
以下語法選出price元素的值等於10.90的所有/catalog/cd元素
/catalog/cd[price=10.90]

 
以下語法選出price元素的值等於10.90的所有/catalog/cd元素 的price元素
/catalog/cd[price=10.90]/price

 
選擇一個以上的路徑
使用Or運算元(|)就可以選擇一個以上的路徑。例如:
/catalog/cd/title | catalog/cd/artist

 
選擇所有title以及artist元素
//title | //artist

 
選擇所有title以及artist以及price元素
//title | //artist | //price

 
選擇屬性
在XPath中,除了選擇元素以外,也可以選擇屬性。屬性都是以@開頭。例如選擇文件中所有叫做country的屬性:
//@country
   
 
選擇所有含有country這個屬性的cd元素:
//cd[@country]
   
 
以下語法選擇出含有屬性的所有cd元素
//cd[@*]
   
 
以下語法選擇出country屬性值為UK的cd元素
//cd[@country='UK']

后面资料转自:http://blog.csdn.net/luyifeiniu/article/details/626202

posted @ 2012-09-03 22:31  人魔七七  阅读(3525)  评论(1编辑  收藏  举报