【引用】iphone xml解析流程

【引用】iphone xml解析流程  

2011-05-06 15:09:35|  分类: 解析 |  标签: |字号 订阅

本文引用自J.K.Terry《iphone xml解析流程》
 
解析 web Service 的XML内容一直是一个难点,很多开发者在这一部分都十分的费力。下面我就我自己写的一个XML的例子来从头到尾的讲一遍其相关的内容。
在很多的情况下,一个服务是通过某种网络API暴露的,它规定客户端发送什么,服务会在响应里发送什么,一般的来说大部分都返回xml格式的数据。
我们来一个拿个接口实例来说一下: http://data.3g.sina.com.cn/api/index.php?page=1&test=1&wm=b100&cid=43
这个一个网络请求地址,当网web Sevice发送这样的一个请求的时候返回的是这样的一个xml的数据:

上面的代码是connection的代理方法,很容易的看出来twitterData里就是我们取得的XML数据,就是我们后面要解析的东西。[selfstartTwitterParser]这个方法被调用就是要正式的解析XML数据了,如下:

//开始对返回的data进行解析————

-(void)startTwitterParser

{

NSXMLParser *parser =[[NSXMLParser alloc]initWithData:twitterData];

parser.delegate = self;

[parser parse];

[parser release];

}

然后就是难点了-如何解析出你想要的内容。

#pragma mark NSXMLParserDelegate--->

- (void)parserDidStartDocument:(NSXMLParser *)parser

{

twitterDic= [[NSMutableDictionary alloc] initWithCapacity:0];//每一条信息都用字典来存;

parserObjects= [[NSMutableArrayalloc]init];//每一组信息都用数组来存,做后得到的数据就在这个数组中

}

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

{

if ([elementName isEqualToString:@"item"]) //找节点进行解析

{

NSMutableDictionary *newNode = [[NSMutableDictionary alloc]initWithCapacity:0];

[parserObjectsaddObject:newNode];

twitterDic = newNode;

}

elseif(twitterDic)

{

if ([elementName isEqualToString:@"enclosure"])

{

//NSLog(@"%@",attributeDict);//存到字典下了

if ([[attributeDict valueForKey:@"url"] hasSuffix:@"jpg"]) //encolsuer下的节点放在字典中

{

[twitterDicsetObject:[attributeDict valueForKey:@"url"] forKey:@"image"];

}

else

{

[twitterDicsetObject:[attributeDict valueForKey:@"url"] forKey:@"video"];

}

}

else

{

NSMutableString *string = [[NSMutableString alloc]initWithCapacity:0];

[twitterDicsetObject:string forKey:elementName];

[string release];

currentText = [[NSStringalloc] init];

currentElementName = elementName;

}

}

}

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

{

currentText= [[NSString alloc] initWithString:string];

}

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

{

if ([elementName isEqualToString:currentElementName])

{

[twitterDic setObject:currentText forKey:currentElementName];//把其他节点放在字典中

}

}

-(void)parserDidEndDocument:(NSXMLParser *)parser//得到的解析结果

{

NSLog(@"%d %@",[parserObjects count],[[parserObjects objectAtIndex:0] valueForKey:@"title"]);

}

#pragma mark NSXMLParserDelegate end----->

 
上面这个些方法都是NSXMLParser的代理方法,分别扮演着不同的角色
首先是 - (void)parserDidStartDocument:(NSXMLParser *)parser
这个方法是解析的开始的方法,我在这一步做的就是初始化了数组和字典了---就是以后存储数据的容器。
接着就是第一步的解析:

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

{

if ([elementName isEqualToString:@"item"]) //找节点进行解析

{

NSMutableDictionary *newNode = [[NSMutableDictionaryalloc] initWithCapacity:0];

[parserObjects addObject:newNode];

twitterDic = newNode;

}

elseif (twitterDic)

{

if ([elementName isEqualToString:@"enclosure"])

{

//NSLog(@"%@",attributeDict);//存到字典下了

if ([[attributeDict valueForKey:@"url"] hasSuffix:@"jpg"]) //encolsuer下的节点放在字典中

{

[twitterDic setObject:[attributeDict valueForKey:@"url"] forKey:@"image"];

}

else

{

[twitterDic setObject:[attributeDict valueForKey:@"url"] forKey:@"video"];

}

}

else

{

NSMutableString *string = [[NSMutableStringalloc] initWithCapacity:0];

[twitterDic setObject:string forKey:elementName];

[string release];

currentText = [[NSString alloc] init];

currentElementName = elementName;

}

}

}

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

{

currentText = [[NSStringalloc] initWithString:string];

}

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

{

if ([elementName isEqualToString:currentElementName])

{

[twitterDicsetObject:currentTextforKey:currentElementName];//把其他节点放在字典中

}

}

-(void)parserDidEndDocument:(NSXMLParser *)parser//得到的解析结果

{

NSLog(@"%d %@",[parserObjectscount],[[parserObjectsobjectAtIndex:0] valueForKey:@"title"]);

}

通过分析xml内容的格式来看整个XML 是以<item>为节点的20条信息内容,而且每个<item>节点下有这着不同的信息,其中有个信息 是<enolsure>,它的下面又有几条信息。按照这样的格式分析,写下了以上代码。大家在写代码的时候要根据自己的需求来写的。通过不停 的触发这些代理方法,直到XML被解析完毕,20条信息就存在数组parserObjects里面了,而且每条信息都以字典的形式存在。于是一个我们可以 随时用的内容就生成了,上面最后一个代理方法的输出就是:20 和title下对应的字符串

原文地址:https://www.cnblogs.com/zhwl/p/2290387.html