Как добавить значение по умолчанию в массив, если дочерний элемент не найден при анализе XML?

StackOverflow https://stackoverflow.com/questions/2229189

Вопрос

Я новичок в разработке 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. Мне нужно добавить объект «O» в массив при анализе второго блока, поскольку он не содержит тега gd:ratings. Поскольку значение присутствует в теге атрибута, для извлечение содержимого и добавление его в изменяемый массив выполняется с помощью метода DidStartElement парсера NSXML.

- (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. Таким образом, массив историй 2 имеет только 15 значений. Поэтому я не могу отобразить его в виде таблицы по порядку. Есть ли способ получить тег атрибута в методе «найденные символы».Пожалуйста, помогите мне. Спасибо.

Это было полезно?

Решение

Вы можете использовать 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 просто замените заполнители реальными значениями.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top