Как добавить значение по умолчанию в массив, когда дочерний элемент не найден при разборе XML? - PullRequest
3 голосов
/ 09 февраля 2010

Я новичок в разработке для 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: Rating и отображаю его значение атрибута numRates в табличном представлении. У меня есть изменяемый массив, в котором хранится значение numRates. Я должен добавить объект "O" в массив, когда второй блок анализируется, потому что он не содержит тег gd: оценок. Так как значение присутствует в теге атрибута, для извлечение содержимого и добавление его в изменяемый массив выполняется с помощью метода синтаксического анализа 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. Так что массив array story2 имеет только 15 значений. Так что я не могу отобразить его в табличном представлении по порядку. Есть ли какой-нибудь выход для получения тег атрибута в методе «найденные символы». Пожалуйста, помогите мне. Спасибо.

Ответы [ 2 ]

2 голосов
/ 09 февраля 2010

Вы можете использовать метод 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 голос
/ 09 февраля 2010

Если вы знаете все поля данных, которые вы ожидаете, вы можете создать словарь с заполнителями для всех ожидаемых значений, прежде чем анализировать XML; когда вы анализируете XML, просто замените заполнители на реальные значения.

...