Использование NSXMLParser с CDATA

Я анализирую RSS-канал с помощью NSXMLParser, и он отлично работает для заголовка и других строк, но одним из элементов является изображение, похожее на

<!CDATA <a href="http:image..etc> 

Как добавить это как изображение моей ячейки в табличное представление? Могу ли я определить это как тип изображения?

Это то, что я использую для разбора:

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{            
//NSLog(@"found this element: %@", elementName);
currentElement = [elementName copy];
if ([elementName isEqualToString:@"item"]) {
    // clear out our story item caches...
    item = [[NSMutableDictionary alloc] init];
    currentTitle = [[NSMutableString alloc] init];
    currentDate = [ [NSMutableString alloc] init];
    currentSummary = [[NSMutableString alloc] init];
    currentLink = [[NSMutableString alloc] init];
}

}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{     
//NSLog(@"ended element: %@", elementName);
if ([elementName isEqualToString:@"item"]) {
    // save values to an item, then store that item into the array...
    [item setObject:currentTitle forKey:@"title"];
    [item setObject:currentLink forKey:@"link"];
    [item setObject:currentSummary forKey:@"description"];
    [item setObject:currentDate forKey:@"date"];

    [stories addObject:[item copy]];
    NSLog(@"adding story: %@", currentTitle);
}

}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
//NSLog(@"found characters: %@", string);
// save the characters for the current item...
if ([currentElement isEqualToString:@"title"]) {
    [currentTitle appendString:string];
} else if ([currentElement isEqualToString:@"link"]) {
    [currentLink appendString:string];
} else if ([currentElement isEqualToString:@"description"]) {
    [currentSummary appendString:string];
} else if ([currentElement isEqualToString:@"pubDate"]) {
    [currentDate appendString:string];
}

}


person Xcoder    schedule 08.07.2009    source источник


Ответы (2)


Смысл CDATA в том, что все, что в нем содержится, не рассматривается как часть XML-документа. Поэтому, если у вас есть теги в CDATA, парсер их проигнорирует.

Я предполагаю, что этот CDATA находится в элементе описания. Поэтому вам нужно будет извлечь теги из элемента «описание» либо вручную, либо с помощью другого экземпляра парсера.

person Justicle    schedule 08.07.2009
comment
Да, там есть URL-адрес изображения. Как я могу извлечь URL-адрес изображения с помощью NSXMLParser? - person Xcoder; 08.07.2009
comment
Посмотрите на строку внутри раздела CDATA. Если это всегда действительный xml, запустите другой экземпляр NSXMLParser для этой строки. Если это недопустимый XML, вам придется сделать что-то еще™, например, найти тег вручную. - person Justicle; 08.07.2009
comment
CMS, такие как Wordpress, имеют описание в тегах CDATA. Кодировщика iPhone, скорее всего, попросят показать текст описания в части чтения RSS своего приложения, как это делают все читатели RSS. Ответ GabrielN - это решение. - person Henrik Erlandsson; 15.03.2012

Ты можешь использовать

- (void)parser:(NSXMLParser *)parser foundCDATA:(NSData *)CDATABlock
{
    NSString *someString = [[NSString alloc] initWithData:CDATABlock encoding:NSUTF8StringEncoding];
}
person Gabriel    schedule 16.04.2010
comment
Это прекрасно работает. Если вам нужно продолжить синтаксический анализ, просто создайте еще один парсер. - person Mariano; 25.06.2010
comment
Это будет ответом для большинства, кто ищет это, чтобы получить работу. Совершенно не очевидно, что initWithData выдаст верную строку из найденного NSData, но, конечно, когда вы ее видите, вы идете «дох!». :) У меня сработало, +1. - person Henrik Erlandsson; 15.03.2012
comment
@Gabriel Пожалуйста, посмотрите мой вопрос stackoverflow.com/questions/43539307/. Как я могу использовать ваш код услышать - person Muju; 21.04.2017