3

私はiPhone開発に不慣れです。XMLページを解析してコンテンツをテーブルビューに表示しています。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の値を格納する可変配列があります。2番目のブロックが解析されるときに、gd:ratingsタグが含まれていないため、配列にオブジェクト「O」を追加する必要があります。値は属性タグに存在するため、コンテンツを取得して可変配列に追加するには、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個の値しかないため、テーブルビューに順番に表示できません。属性タグを取得する方法はありますか。 「見つかった文字」メソッドで。手伝ってください。ありがとう。

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 に答える