2009-07-08 3 views
11

Я разборе RSS фид с NSXMLParser и это работает прекрасно для заголовка и других строк, но один из элементов является изображением Thats какИспользование NSXMLParser с CDATA

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

}

ответ

4

Точка CDATA является то, что что-либо внутри него не рассматривается как часть документа XML. Итак, если у вас есть теги в CDATA, синтаксический анализатор будет игнорировать их.

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

+0

Да, есть URL изображения там. Как я могу извлечь URL-адрес изображения с помощью NSXMLParser? – Xcoder

+0

Посмотрите на строку внутри раздела CDATA. Если он всегда является допустимым xml, запустите еще один экземпляр NSXMLParser в строке * this *. Если это недопустимый XML, вам нужно будет сделать Something Else ™, например, найти тег вручную. – Justicle

+0

CMS, такие как Wordpress, имеют описание в тегах CDATA. Кодексу Iphone, скорее всего, будет предложено показать текст описания в части читателя RSS его приложения, как и все читатели RSS. Ответ GabrielN - это решение. –

20

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

- (void)parser:(NSXMLParser *)parser foundCDATA:(NSData *)CDATABlock 
{ 
    NSString *someString = [[NSString alloc] initWithData:CDATABlock encoding:NSUTF8StringEncoding]; 
} 
+0

Это отлично работает. Если вам нужно проанализировать дальше, просто создайте еще один парсер. – Mariano

+0

Это будет ответ для большинства, кто ищет это, чтобы выполнить работу. Совершенно очевидно, что initWithData выдаст действительную строку из найденных NSData, но, конечно, когда вы ее видите, вы идете «doh!». :) Работал для меня, +1. –

+0

@Gabriel. См. Мой вопрос http://stackoverflow.com/questions/43539307/how-to-post-string-with-special-character-using-xml-parsing-in-objective-c. Как я могу использовать ваш код? – Muju

Смежные вопросы