IOS成长之路-解析xml数据
2013-03-29 23:15
393 查看
需要解析的 xml 数据:
[html]
view plaincopyprint?
<?xml version="1.0" encoding="UTF-8"?>
<Data>
<Movie>
<title>good lucky to you</title>
<box>111</box>
<summary>This is a story</summary>
</Movie>
<Movie>
<title>hello</title>
<box>99</box>
<summary>oh,yes</summary>
</Movie>
<Movie>
<title>who am i</title>
<box>22</box>
<summary>chenglong</summary>
</Movie>
</Data>
通过 上上篇的博客《获取网络数据》 中描述的过程和程序我们可以得到网络上的数据,还可以在这个过程中把数据传递给进行解析数据的方法进行解析的操作,
[cpp]
view plaincopyprint?
//自定义一个 PraxMovie 方法,参数时NSDate型的数据,用来传递接受到的数据
- (void)PraxMovie:(NSData*)_data
{
//NSXMLParser解析xml格式的数据,在这里初始化,并赋值
NSXMLParser* parser = [[NSXMLParser alloc]initWithData:_data];
parser.delegate = self;
[parser parse];
}
在解析之前我们要进行清空以前的数据,因为在运行程序的过程中我们有时候会运行多次,所以要删除旧的数据
(注意: 在这个程序中,我们用到了 Movie 和 MovieList 这两个类,Movie中存放的是三个属性[电影名称,票房,介绍],用来存放解析 xml 后得到的三个数据,
而 MovieList 类中定义了 一个可以改变的数组,用来存放 Movie 对象,并实现增加,删除,和查询数组中的 Movie对象的数量 等方法)
[cpp]
view plaincopyprint?
//解析前的准备
- (void)parserDidStartDocument:(NSXMLParser *)parser
{
//移出所有,对MovieList 类中的数组清空 MovieList *xmlMovielist;
[self.xmlMovielist.moviearray removeAllObjects];
[self.tempString setString:@""];
}
查询所有的节点,并得到每一个节点中的数据
[cpp]
view plaincopyprint?
//查询节点,同时alloc 出一个Movie对象 ,用于储存数据
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qualifiedName
attributes:(NSDictionary *)attributeDict
{
if([elementName isEqualToString:@"Movie"])
{
self.newwMovie = nil;
self.newwMovie= [[Movie alloc] init];
[self.tempString setString:@""];
}
else
{
[self.tempString setString:@""];
}
}
//找到节点数据,通过NSString对象来传递
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
if(![string isEqualToString:@""])
{
[self.tempString appendString:string];
}
}
然后把得到得得 节点 进行区分,并把得到得相应数据 存放到不同得 Movie属性 中
[cpp]
view plaincopyprint?
//根据查询到的节点,保存数据
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
if([elementName isEqualToString:@"Movie"])
{
//存放到数组中
[self.xmlMovielist Addmovie:self.newwMovie];
}
else if([elementName isEqualToString:@"title"])
{
//Movie 得title 属性
self.newwMovie.title =[NSString stringWithString:self.tempString];
}
else if([elementName isEqualToString:@"box"])
{
// Movie boxOfficeGross 属性
int temp = [[NSString stringWithString:self.tempString]intValue];
self.newwMovie.boxOfficeGross = [NSNumber numberWithInt:temp];
}
else if([elementName isEqualToString:@"summary"])
{
//Movie 得 summary 属性
self.newwMovie.summary =[NSString stringWithString:self.tempString];
}
}
当解析完最后一个节点后,解析结束,
[cpp]
view plaincopyprint?
//解析结束
- (void)parserDidEndDocument:(NSXMLParser *)parser
{
//遍历数组,输出每一个节点数据
for (id tmp in self.xmlMovielist.moviearray)
{
NSLog(@"tmp = %@",tmp);
}
self.newwMovie = nil;
self.tempString = nil;
}
解析得过程:
先执行查询节点的方法,然后执行得到节点中的数据的方法,接下来执行 区分节点进行保存数据 ,
<--------------------------
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qualifiedName
attributes:(NSDictionary *)attributeDict
到-------》
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
再到-------》
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
------------------------------>
每一个节点都会把这三个方法执行一次,当一个节点遍历完后,再重新执行这一过程去遍历下一个节点,直到所有的节点都遍历完,最后执行:
- (void)parserDidEndDocument:(NSXMLParser *)parser
原文地址:http://blog.csdn.net/like7xiaoben/article/details/7593182
[html]
view plaincopyprint?
<?xml version="1.0" encoding="UTF-8"?>
<Data>
<Movie>
<title>good lucky to you</title>
<box>111</box>
<summary>This is a story</summary>
</Movie>
<Movie>
<title>hello</title>
<box>99</box>
<summary>oh,yes</summary>
</Movie>
<Movie>
<title>who am i</title>
<box>22</box>
<summary>chenglong</summary>
</Movie>
</Data>
<?xml version="1.0" encoding="UTF-8"?> <Data> <Movie> <title>good lucky to you</title> <box>111</box> <summary>This is a story</summary> </Movie> <Movie> <title>hello</title> <box>99</box> <summary>oh,yes</summary> </Movie> <Movie> <title>who am i</title> <box>22</box> <summary>chenglong</summary> </Movie> </Data>
通过 上上篇的博客《获取网络数据》 中描述的过程和程序我们可以得到网络上的数据,还可以在这个过程中把数据传递给进行解析数据的方法进行解析的操作,
[cpp]
view plaincopyprint?
//自定义一个 PraxMovie 方法,参数时NSDate型的数据,用来传递接受到的数据
- (void)PraxMovie:(NSData*)_data
{
//NSXMLParser解析xml格式的数据,在这里初始化,并赋值
NSXMLParser* parser = [[NSXMLParser alloc]initWithData:_data];
parser.delegate = self;
[parser parse];
}
//自定义一个 PraxMovie 方法,参数时NSDate型的数据,用来传递接受到的数据 - (void)PraxMovie:(NSData*)_data { //NSXMLParser解析xml格式的数据,在这里初始化,并赋值 NSXMLParser* parser = [[NSXMLParser alloc]initWithData:_data]; parser.delegate = self; [parser parse]; }
在解析之前我们要进行清空以前的数据,因为在运行程序的过程中我们有时候会运行多次,所以要删除旧的数据
(注意: 在这个程序中,我们用到了 Movie 和 MovieList 这两个类,Movie中存放的是三个属性[电影名称,票房,介绍],用来存放解析 xml 后得到的三个数据,
而 MovieList 类中定义了 一个可以改变的数组,用来存放 Movie 对象,并实现增加,删除,和查询数组中的 Movie对象的数量 等方法)
[cpp]
view plaincopyprint?
//解析前的准备
- (void)parserDidStartDocument:(NSXMLParser *)parser
{
//移出所有,对MovieList 类中的数组清空 MovieList *xmlMovielist;
[self.xmlMovielist.moviearray removeAllObjects];
[self.tempString setString:@""];
}
//解析前的准备 - (void)parserDidStartDocument:(NSXMLParser *)parser { //移出所有,对MovieList 类中的数组清空 MovieList *xmlMovielist; [self.xmlMovielist.moviearray removeAllObjects]; [self.tempString setString:@""]; }
查询所有的节点,并得到每一个节点中的数据
[cpp]
view plaincopyprint?
//查询节点,同时alloc 出一个Movie对象 ,用于储存数据
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qualifiedName
attributes:(NSDictionary *)attributeDict
{
if([elementName isEqualToString:@"Movie"])
{
self.newwMovie = nil;
self.newwMovie= [[Movie alloc] init];
[self.tempString setString:@""];
}
else
{
[self.tempString setString:@""];
}
}
//找到节点数据,通过NSString对象来传递
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
if(![string isEqualToString:@""])
{
[self.tempString appendString:string];
}
}
//查询节点,同时alloc 出一个Movie对象 ,用于储存数据 - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict { if([elementName isEqualToString:@"Movie"]) { self.newwMovie = nil; self.newwMovie= [[Movie alloc] init]; [self.tempString setString:@""]; } else { [self.tempString setString:@""]; } } //找到节点数据,通过NSString对象来传递 - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { if(![string isEqualToString:@""]) { [self.tempString appendString:string]; } }
然后把得到得得 节点 进行区分,并把得到得相应数据 存放到不同得 Movie属性 中
[cpp]
view plaincopyprint?
//根据查询到的节点,保存数据
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
if([elementName isEqualToString:@"Movie"])
{
//存放到数组中
[self.xmlMovielist Addmovie:self.newwMovie];
}
else if([elementName isEqualToString:@"title"])
{
//Movie 得title 属性
self.newwMovie.title =[NSString stringWithString:self.tempString];
}
else if([elementName isEqualToString:@"box"])
{
// Movie boxOfficeGross 属性
int temp = [[NSString stringWithString:self.tempString]intValue];
self.newwMovie.boxOfficeGross = [NSNumber numberWithInt:temp];
}
else if([elementName isEqualToString:@"summary"])
{
//Movie 得 summary 属性
self.newwMovie.summary =[NSString stringWithString:self.tempString];
}
}
//根据查询到的节点,保存数据 - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { if([elementName isEqualToString:@"Movie"]) { //存放到数组中 [self.xmlMovielist Addmovie:self.newwMovie]; } else if([elementName isEqualToString:@"title"]) { //Movie 得title 属性 self.newwMovie.title =[NSString stringWithString:self.tempString]; } else if([elementName isEqualToString:@"box"]) { // Movie boxOfficeGross 属性 int temp = [[NSString stringWithString:self.tempString]intValue]; self.newwMovie.boxOfficeGross = [NSNumber numberWithInt:temp]; } else if([elementName isEqualToString:@"summary"]) { //Movie 得 summary 属性 self.newwMovie.summary =[NSString stringWithString:self.tempString]; } }
当解析完最后一个节点后,解析结束,
[cpp]
view plaincopyprint?
//解析结束
- (void)parserDidEndDocument:(NSXMLParser *)parser
{
//遍历数组,输出每一个节点数据
for (id tmp in self.xmlMovielist.moviearray)
{
NSLog(@"tmp = %@",tmp);
}
self.newwMovie = nil;
self.tempString = nil;
}
//解析结束 - (void)parserDidEndDocument:(NSXMLParser *)parser { //遍历数组,输出每一个节点数据 for (id tmp in self.xmlMovielist.moviearray) { NSLog(@"tmp = %@",tmp); } self.newwMovie = nil; self.tempString = nil; }
解析得过程:
先执行查询节点的方法,然后执行得到节点中的数据的方法,接下来执行 区分节点进行保存数据 ,
<--------------------------
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qualifiedName
attributes:(NSDictionary *)attributeDict
到-------》
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
再到-------》
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
------------------------------>
每一个节点都会把这三个方法执行一次,当一个节点遍历完后,再重新执行这一过程去遍历下一个节点,直到所有的节点都遍历完,最后执行:
- (void)parserDidEndDocument:(NSXMLParser *)parser
原文地址:http://blog.csdn.net/like7xiaoben/article/details/7593182
相关文章推荐
- IOS成长之路-解析xml数据
- IOS成长之路-实现界面切换和数据的传递
- iOS:网络编程中三个数据解析协议HTTP、XML、JSON的详细介绍
- iOS开发之网络数据解析(二)--XML解析简介
- iOS学习之解析XML数据
- iOS开发之解析XML数据
- IOS学习之十六:网络数据的XML解析
- IOS XML的类型数据的解析
- ios 数据解析(XML,JSON)
- iOS之数据解析 (JSON 、XML)
- iOS开发使用GDataXML框架解析网络数据
- iOS 网络数据之XML解析
- IOS学习之十六:网络数据的XML解析 .
- 玩转iOS开发 - JSON 和 Xml 数据解析
- iOS UIXMLParser 解析数据
- iOS中的数据解析(XML,JSON),SAX解析,DOM解析
- iOS网络编程解析协议二:XML数据传输解析
- iOS数据解析,XML(SAX,DOM - GDataXMLNode)
- iOS开发:xmpp下的xml数据解析及修改上传
- iOS开发网络篇之Web Service和XML数据解析