3 Stimmen

Wie fügen Sie einen Standardwert zu einem Array, wenn Kind-Element nicht in Xml-Parsing gefunden wird?

Ich bin neu auf iphone development.I bin Parsen einer XML-Seite und die Anzeige der Inhalte in einem tableview.In einigen Block in der XML-Seite, das Kind Element fehlt, möchte ich einen Wert o in meinem Array hinzufügen, wenn das Kind Element nicht in den bestimmten block.My XML-Datei ist wie

 <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

Ich analysiere das gd:ratings-Tag und zeige den Wert des Attributs numRates in einer Tabellenansicht an. Ich habe ein veränderbares Array, das den Wert von numRates.I speichert, um Objekt "O" in das Array hinzuzufügen, wenn der zweite Block geparst wird, weil es nicht gd:ratings tag.Since der Wert in einem Attribut-Tag vorhanden ist, für das Abrufen des Inhalts und das Hinzufügen zu dem veränderbaren Array in NSXML-Parser DidStartElement-Methode erfolgt.

- (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];
}   
}

Da gibt es 25 Blöcke von Eintrags-Tags und in diesem 10 Block doesnot haben gd Rating-Element. so das Array Stories2 Array hat nur 15 Werte. so kann ich nicht anzeigen, es in der tableview in Ordnung. gibt es irgendeinen Weg aus, um das Attribut Tag in "gefundene Zeichen" Methode abrufen. Bitte helfen Sie mir, danke.

2voto

Felix Lamouroux Punkte 7322

Sie können die didEndElement Methode: Wenn das äußere Element beendet ist, prüfen, ob das Kindelement dem Array hinzugefügt wurde.

Sie könnten einen iVar verwenden BOOL entryHasRating und gehen Sie wie folgt vor:

- (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;
     ...
   }
}

Dann, wenn ein Element endet:

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

1voto

jessecurry Punkte 21963

Wenn Sie alle Datenfelder kennen, die Sie erwarten, können Sie ein Wörterbuch mit Platzhaltern für alle erwarteten Werte erstellen, bevor Sie das XML parsen; wenn Sie das XML parsen, ersetzen Sie einfach die Platzhalter durch echte Werte.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X