2012-07-15 45 views
5

Estoy intentando analizar un archivo XML (utilizando NSXMLParser) desde el sitio web librarything.com. Este es el primer archivo que he analizado, pero en su mayor parte parece bastante sencillo. Mi problema ocurre cuando intento analizar un bloque CDATA; el analizador del método: foundCDATA: no se llama, y ​​no puedo entender por qué. Sé que mi analizador está configurado correctamente porque el método analizador: foundCharacters: funciona bien. Los datos XML que intento analizar se parecen a este http://www.librarything.com/services/rest/1.1/?method=librarything.ck.getwork&isbn=030788743X&apikey=d231aa37c9b4f5d304a60a3d0ad1dad4 y el bloque CDATA se produce dentro del elemento con el nombre de atributo "descripción".Analizando bloques XML CDATA

¡Se agradecerá cualquier ayuda sobre por qué no se llama al método!

EDIT: ejecuté el analizador: foundCharacters: método en la descripción del bloque CDATA y devolvió "<". Supongo que esto significa que el analizador no está viendo correctamente la etiqueta CDATA. ¿Hay algo que se pueda hacer por mi parte para arreglar esto?

Respuesta

2

Parece que el contenido de CDATA en las etiquetas <fact> se devuelve de forma incremental en múltiples llamadas en parser:foundCharacters. En que la clase en la que se están conformando a NSXMLParserDelegate tratar la construcción de la CDATA añadiendo a una instancia NSMutableString, así:

(Nota: aquí _currentElement es una propiedad NSString y _factString es una propiedad NSMutableString)

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict {  
    self.currentElement = elementName; 
    if ([_currentElement isEqualToString:@"fact"]) { 
     // Make a new mutable string to store the fact string 
     self.factString = [NSMutableString string]; 
    } 

} 

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { 
    if ([elementName isEqualToString:@"fact"]) { 
     // If fact string starts with CDATA tags then just get the CDATA without the tags 
     NSString *prefix = @"<![CDATA["; 
     if ([_factString hasPrefix:prefix]) { 
      NSString *cdataString = [_factString substringWithRange:NSMakeRange((prefix.length+1), _factString.length - 3 -(prefix.length+1))]; 
      // Do stuff with CDATA here... 
      NSLog(@"%@", cdataString); 
      // No longer need the fact string so make a new one ready for next XML CDATA 
      self.factString = [NSMutableString string]; 

     } 
    } 

} 

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 
    if ([_currentElement isEqualToString:@"fact"]) { 
     // If we are at a fact element, append the string 
     // CDATA is returned to this method in more than one go, so build the string up over time 
     [_factString appendString:string]; 
    } 

}