2009-07-08 7 views
11

J'analyse un flux RSS avec NSXMLParser et il fonctionne très bien pour le titre et d'autres chaînes, mais l'un des éléments est une image des thats commeEn utilisant NSXMLParser avec CDATA

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

Comment puis-je ajouter que mon image de la cellule dans ma vue de la table? Est-ce que je définirais cela comme un type d'image?

C'est ce que j'utilise pour faire mon analyse:

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

}

Répondre

4

Le point de CDATA est que tout ce qui s'y trouve n'est pas traité comme faisant partie du document XML. Donc, si vous avez des balises dans CDATA, l'analyseur les ignorera.

Je suppose que ce CDATA est dans l'élément de description. Vous devrez donc extraire les balises de l'élément "description", manuellement ou via une autre instance d'un analyseur.

+0

Oui, il y a une URL d'image là-dedans. Comment puis-je extraire une URL d'image à l'aide de NSXMLParser? – Xcoder

+0

Jetez un oeil à la chaîne dans la section CDATA. Si c'est toujours un xml valide, lancez une autre instance de NSXMLParser sur * cette * chaîne. Si ce n'est pas du XML valide, vous devrez faire quelque chose d'autre, par exemple, trouver le tag manuellement. – Justicle

+0

Les CMS tels que Wordpress ont la description dans les balises CDATA. Un codeur Iphone sera probablement invité à afficher le texte de description dans la partie lecteur RSS de son application, comme tous les lecteurs RSS. La réponse de GabrielN est la solution. –

20

Vous pouvez utiliser

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

Cela fonctionne très bien. Si vous avez besoin d'analyser plus en détail, créez simplement un autre analyseur. – Mariano

+0

Ce sera la réponse pour la plupart de ceux qui recherchent cela pour faire un travail. Il n'est pas du tout évident que initWithData va donner une chaîne valide à partir du NSData trouvé, mais bien sûr quand vous le voyez vous allez 'doh!'. :) A travaillé pour moi, +1. –

+0

@Gabriel S'il vous plaît voir ma question http://stackoverflow.com/questions/43539307/how-to-post-string-with-special-character-using-xml-parsing-in-objective-c. Comment puis-je utiliser votre code entendre – Muju