子要素は、XML解析で発見されていない場合にどのようにデフォルト値が配列に追加しますか?
-
19-09-2019 - |
質問
私は子要素が欠落している、XMLページ内のいくつかのブロックをXMLページを解析し、tableview.Inでコンテンツを表示していますiphone development.Iに新しいです、私はとき、私の配列中のO値を追加したいです子要素は、特定のblock.Myの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
評価タグとテーブルビューでその属性numRates値を表示します。私はGDを解析しています。評価のために、値は属性タグに存在しているtag.Since:私はそれがGD含まdoesnotため、2番目のブロックが解析されるときnumRates.Iの値は、配列内のオブジェクト「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];
}
}
配列stories2配列がわずか15 values.Soを持っているの.so 25個のエントリータグのブロックと、10ブロックでdoesnotが持つGDの評価要素があるので、は、私が取得するために、そこorder.Isでテーブルビューにどのような方法でそれを表示することができません「見つかった文字」方式での属性タグ。私をout.Thanks助けてください。
解決
子要素が配列に追加されたかどうかを確認、外側の要素は終了
あなたは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;
}
...
}
他のヒント
あなたが期待されますデータフィールドのすべてを知っている場合は、XMLを解析する前に、あなたはあなたの期待値のすべてのプレースホルダを持つ辞書を構築できます。あなたがXMLをパースとしてだけで実際の値にプレースホルダを置き換えます。
所属していません StackOverflow