2009-07-08 37 views
11

estoy analizar un RSS feed con NSXMLParser y está funcionando muy bien para el título y otras cadenas, pero uno de los elementos es un eso de imagen comoUsando NSXMLParser con CDATA

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

¿Cómo añado que como mi imagen de la celda en mi vista de tabla? ¿Lo definiría como un tipo de imagen?

Esto es lo que estoy usando para hacer mi análisis:

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

}

Respuesta

4

El punto de CDATA es que cualquier cosa dentro de ella no se trata como parte del documento XML. Entonces, si tiene etiquetas en CDATA, el analizador las ignorará.

Supongo que este CDATA está en el elemento de descripción. Por lo tanto, deberá extraer las etiquetas del elemento "descripción", ya sea manualmente o mediante otra instancia de un analizador.

+0

Sí, hay una URL de la imagen en ese país. ¿Cómo puedo extraer una URL de imagen usando NSXMLParser? – Xcoder

+0

Eche un vistazo a la cadena dentro de la sección CDATA. Si es siempre válido xml, encienda otra instancia de NSXMLParser en * esa * cadena. Si no es XML válido, tendrá que hacer Something Else ™, por ejemplo, encontrar la etiqueta manualmente. – Justicle

+0

CMSes como Wordpress tienen la descripción en etiquetas CDATA. Es probable que se le pida a un codificador de Iphone que muestre el texto descriptivo en la parte del lector de RSS de su aplicación, tal como lo hacen todos los lectores de RSS. La respuesta de GabrielN es la solución. –

20

Puede utilizar

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

Esto funciona genial. Si necesita analizar más a fondo, simplemente cree otro analizador. – Mariano

+0

Esta será la respuesta para la mayoría de quienes buscan esto para hacer un trabajo. No es del todo obvio que initWithData dará una cadena válida de los NSData encontrados, pero por supuesto cuando lo ve, ¡dice 'doh!'. :) Trabajó para mí, +1. –

+0

@Gabriel Consulte mi pregunta http://stackoverflow.com/questions/43539307/how-to-post-string-with-special-character-using-xml-parsing-in-objective-c. ¿Cómo puedo usar tu código? – Muju