解析xml数据

需要解析的 xml 数据:

<?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>

 

在这个过程中把数据传递给进行解析数据的方法进行解析的操作,

//自定义一个 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对象的数量 等方法)

//解析前的准备
- (void)parserDidStartDocument:(NSXMLParser *)parser
{
    //移出所有,对MovieList 类中的数组清空    MovieList *xmlMovielist;
    [self.xmlMovielist.moviearray removeAllObjects];
    [self.tempString setString:@""];
}

查询所有的节点,并得到每一个节点中的数据

//查询节点,同时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属性 中

//根据查询到的节点,保存数据
- (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)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

posted @ 2012-05-25 10:21  泪啸  阅读(483)  评论(0编辑  收藏  举报