Как добавить значение по умолчанию в массив, если дочерний элемент не найден при анализе XML?
-
19-09-2019 - |
Вопрос
Я новичок в разработке 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 просто замените заполнители реальными значениями.