3

我是 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 标记并在表格视图中显示其属性 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 评级元素。所以数组 stories2 数组只有 15 个值。所以我无法在 tableview 中按顺序显示它。有没有办法检索属性标签在“找到字符”方法中。请帮帮我。谢谢。

4

2 回答 2

2

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

您可以使用 iVarBOOL 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; 
   }
   ...
}
于 2010-02-09T13:41:57.967 回答
1

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

于 2010-02-09T14:52:32.027 回答