iphone XML解析
2011-05-05 22:59
176 查看
转自:http://blog.csdn.net/sjzsp/archive/2011/04/11/6314714.aspx
解析 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数据,就是我们后面要解析的东西。[ self startTwitterParser] 这个方法被调用就是要正式的解析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 = [[ NSMutableArray alloc ] 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 ];
[parserObjects addObject :newNode];
twitterDic = newNode;
}
else if ( 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 = [[ NSMutableString alloc ] initWithCapacity : 0 ];
[twitterDic setObject :string forKey :elementName];
[string release ];
currentText = [[NSString alloc ] 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 = [[ NSMutableDictionary alloc ] initWithCapacity : 0 ];
[parserObjects addObject :newNode];
twitterDic = newNode;
}
else if ( 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 = [[ NSMutableString alloc ] initWithCapacity : 0 ];
[twitterDic setObject :string forKey :elementName];
[string release ];
currentText = [[NSString alloc ] 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" ]);
}
通过分析xml内容的格式来看整个XML 是以<item>为节点的20条信息内容,而且每个<item>节点下有这着不同的信息,其中有个信息 是<enolsure>,它的下面又有几条信息。按照这样的格式分析,写下了以上代码。大家在写代码的时候要根据自己的需求来写的。通过不停 的触发这些代理方法,直到XML被解析完毕,20条信息就存在数组parserObjects里面了,而且每条信息都以字典的形式存在。于是一个我们可以 随时用的内容就生成了,上面最后一个代理方法的输出就是:20 和title下对应的字符串;
大家可以试试!
解析 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数据,就是我们后面要解析的东西。[ self startTwitterParser] 这个方法被调用就是要正式的解析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 = [[ NSMutableArray alloc ] 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 ];
[parserObjects addObject :newNode];
twitterDic = newNode;
}
else if ( 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 = [[ NSMutableString alloc ] initWithCapacity : 0 ];
[twitterDic setObject :string forKey :elementName];
[string release ];
currentText = [[NSString alloc ] 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 = [[ NSMutableDictionary alloc ] initWithCapacity : 0 ];
[parserObjects addObject :newNode];
twitterDic = newNode;
}
else if ( 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 = [[ NSMutableString alloc ] initWithCapacity : 0 ];
[twitterDic setObject :string forKey :elementName];
[string release ];
currentText = [[NSString alloc ] 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" ]);
}
通过分析xml内容的格式来看整个XML 是以<item>为节点的20条信息内容,而且每个<item>节点下有这着不同的信息,其中有个信息 是<enolsure>,它的下面又有几条信息。按照这样的格式分析,写下了以上代码。大家在写代码的时候要根据自己的需求来写的。通过不停 的触发这些代理方法,直到XML被解析完毕,20条信息就存在数组parserObjects里面了,而且每条信息都以字典的形式存在。于是一个我们可以 随时用的内容就生成了,上面最后一个代理方法的输出就是:20 和title下对应的字符串;
大家可以试试!
相关文章推荐
- [iPhone]XML文件解析 parsing-xml-files NSXMLParser
- iPhone中两种XML解析方式NSXMLParser和GDataXMLNode
- iPhone开发【十九】XML解析之NSXMLParser(使用Web Services查询火车信息)
- iPhone开发技巧之网络篇(1)--- 解析XML
- iphone开发 NSXMLParser解析xml文件
- iPhone 两种常用的XML解析方式(NSXMLParser & GDataXMLNode)(转载)
- 【引用】iphone xml解析流程
- iPhone解析XML显示网络上的照片
- iPhone开发笔记——webservice解析xml
- iPhone/iPad 开发: 解析本地/网络上的xml文件
- iphoneXML解析方法
- iphone objective-c解析xml字符串(接收格式参照上篇 webservie xml字符串传值)
- iPhone开发中的XML解析类库对比
- iPhone开发技巧之网络篇(1)— 解析XML
- Iphone json解析xml
- iphone XML解析的基本流程
- iphone XML解析的基本流程
- iPhone HTTP获得XML并使用GDataXML解析
- Objective-C ,ios,iphone开发基础:使用GDataXML解析XML文档,(libxml/tree.h not found 错误解决方案)
- iPhone开发【十九】XML解析之NSXMLParser(使用Web Services查询火车信息)