您的位置:首页 > 移动开发 > IOS开发

关于iOS解析XML使用NSXMLParser和GDataXML不得不说的一些事

2015-07-07 20:01 501 查看
NSXMLParser

最近刚学习iOS,需要解析一个XML如下:http://wthrcdn.etouch.cn/WeatherApi?citykey=101050101,最开始选择使用自带的NSXMLParser,首先,NSXMLParser必须继承NSXMLParserDelegate协议

@interface ...   : ...  <NSXMLParserDelegate>


然后就是要初始化啦,

- (void)viewDidLoad {

NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];//设置XML数据

[parser setDelegate:self];

[parser parse];

}


(1)遍例xml的节点,是所有的节点

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
}


(2)当xml节点有值时,则进入,用来取出
<a></a>
之间的值

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
}


(3)当遇到结束标记时,进入,用来存储上述(2)取得值,

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
}


在遍历结束前,会反复执行上述三个方法,但是在解析的过程中,出现了一个问题,就是数字和文字分离的情况,比如,2级,解析的结果是2和级而不是2级,最终也没弄明白事什么原因,随后又换了GDataXML,就没有这个问题了。

2.GDataXML

GDataXMLNode是Google提供的用于XML数据处理的类集。该类集对libxml2–DOM处理方式进行了封装,能对较小或中等的xml文档进行读写操作且支持XPath语法。

(1)获取GDataXMLNode.h/m文件,将GDataXMLNode.h/m文件添加到工程中

(2)工程中增加“libxml2.dylib”库

(3)在工程的“Build Settings”页中找到“Header Search Path”项,添加/usr/include/libxml2”到路径中,在Linking中找到 Other Linker Flags 对应的值改为:-lxml2。

(4)添加“GDataXMLNode.h”文件到头文件中

首先,初始化GDataXMLDocument,在定义根元素,以及根元素下一层的孩子元素

- (void)viewDidLoad
{
NSString *path = [NSString stringWithFormat:@"http://wthrcdn.etouch.cn/WeatherApi?citykey=101050101"];
NSURL *url = [[NSURL alloc] initWithString:path];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
NSData *urlData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
GDataXMLDocument *xmlDoc = [[GDataXMLDocument alloc] initWithData:urlData options:0 error:nil];
GDataXMLElement *xmlEle = [xmlDoc rootElement];  //根元素 resp
NSArray *array = [xmlEle children];//孩子元素city,updatetime...
[self parseXml:array];
}


然后就是层层循环嵌套的过程啦

-(void) parseXml:(NSArray *)array
{
for (int i = 0; i<[array count]; i++) {
GDataXMLElement *ele = [array objectAtIndex:i];
if([[ele name] isEqualToString:@"city"])
...
else if ([[ele name] isEqualToString:@"forecast"]) {
GDataXMLDocument *weatherxml = [[GDataXMLDocument alloc]initWithRootElement:ele];
GDataXMLElement *weatherxmlele = [weatherxml rootElement];//根元素 forecast
NSArray *weatherarray = [weatherxmlele children];//孩子元素 weather
for(int j = 0;j<[weatherarray count];j++)
}
}
}


GDataXML的方式很容易理解,就是在不停嵌套的时候对跟和孩子不要弄晕就好啦!本人才疏学浅,有不对的地方还忘批评指正!

版权声明:本文为博主原创文章,未经博主允许不得转载。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ios xml 解析