我是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中按顺序显示它。有什么办法可以检索“找到的字符”方法中的属性标记。请帮帮我。谢谢。
答案 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时,只需用实际值替换占位符。