在xml解析中找不到子元素时,如何向数组添加默认值?

时间:2010-02-09 13:06:19

标签: iphone objective-c nsxmlparser xml-parsing

我是iphone开发的新手。我正在解析XML页面并在tableview中显示内容。在XML页面的某个块中,缺少子元素,我想在我的数组中添加值o,子元素不喜欢特定的块。我的XML文件就像

 <entry>
 <id>xxx </id>
 <title>xxxxx</title>
 <gd:ratings numRaters="2"/>
 </entry> ..................................>first block
 <entry>
 <id>xxx </id>
 <title>xxxxx</title>
 </entry> ....................................>Second block
 <entry>
 <id>xxx </id>
 <title>xxxxx</title>
 <gd:ratings numRaters="2"/>
 </entry> .....................................>Third block

我正在解析gd:ratings标签并在tableview中显示其属性numRates值。我有一个可变数组,它存储numRates的值。当解析第二个块时,我必须在数组中添加对象“O”,因为它不包含gd:ratings标签。因为该值存在于属性标记中,检索内容并将其添加到可变数组是在NSXML解析器DidStartElement方法中完成的。

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

currentElement = [elementName copy];
if ([elementName isEqualToString:@"entry"]) {

    entry = [[NSMutableDictionary alloc] init];
    currentTitle = [[NSMutableString alloc] init];
    currentDate = [[NSMutableString alloc] init];
    NSLog(@"inside image1 ");
}else if([elementName isEqualToString:@"media:thumbnail"])
    { currentImage = [[NSMutableString alloc] init];
        if(myUrl == nil){   
        myUrl = [NSString stringWithString:[attributeDict objectForKey:@"url"]];
        }
        [currentImage appendString:myUrl];  
        [stories1 addObject:currentImage];
        myUrl=nil;
        }   else if([elementName isEqualToString:@"gd:rating"])
{
    currentRating=[[NSMutableString alloc]init];

        myRatings=[NSString stringWithString:[attributeDict objectForKey:@"numRaters"]];

    [currentRating appendString:myRatings];
    [stories2 addObject:currentRating];
}   
}

由于有25个条目标记块,并且10个块没有gd rating元素。因此,数组stories2数组只有15个值。所以我无法在tableview中按顺序显示它。有什么办法可以检索“找到的字符”方法中的属性标记。请帮帮我。谢谢。

2 个答案:

答案 0 :(得分:2)

您可以使用didEndElement方法:当外部元素结束时,检查子元素是否已添加到数组中。

您可以使用iVar BOOL entryHasRating并执行以下操作:

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

   currentElement = [elementName copy];
   if ([elementName isEqualToString:@"entry"]) {
     entryHasRating = NO;
     ...
   } else if ([elementName isEqualToString:@"gd:rating"]){
     entryHasRating = YES;
     ...
   }
}

然后当元素结束时:

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
   if ([elementName isEqualToString:@"entry"]&& !entryHasRating) {
       [stories2 addObject:@"No Rating"];
       entryHasRating = YES; 
   }
   ...
}

答案 1 :(得分:1)

如果您知道您期望的所有数据字段,则可以在解析XML之前为所有预期值构建包含占位符的字典;在解析XML时,只需用实际值替换占位符。