2012-07-15 22 views
5

Próbuję sparsować plik XML (przy użyciu NSXMLParser) ze strony librarything.com. To jest pierwszy plik, jaki kiedykolwiek analizowałem, ale w przeważającej części wydaje się to dość proste. Mój problem występuje podczas próby analizowania bloku CDATA; parser metody: foundCDATA: nie jest wywoływany i nie mogę zrozumieć dlaczego. Wiem, że mój parser jest poprawnie skonfigurowany, ponieważ parser: foundCharacters: metoda działa poprawnie. Dane XML, które próbuję analizować, wyglądają tak: http://www.librarything.com/services/rest/1.1/?method=librarything.ck.getwork&isbn=030788743X&apikey=d231aa37c9b4f5d304a60a3d0ad1dad4, a blok CDATA występuje wewnątrz elementu z nazwą atrybutu "description".Parsowanie bloków XML CDATA

Każda pomoc, dlaczego metoda nie jest wywoływana, byłaby bardzo doceniana!

EDYTOWANIE: Uruchomiłem parser: foundCharacters: metoda na bloku CDATA opisu i zwróciła "<". Zakładam, że oznacza to, że analizator składni nie widzi poprawnie znacznika CDATA. Czy jest coś, co można zrobić, aby to naprawić?

Odpowiedz

2

Wygląda na to, że zawartość CDATA w tagach <fact> jest zwracana przyrostowo w wielu powtórzeniach połączeń w parser:foundCharacters. W Tobie klasie, gdzie są zgodne z NSXMLParserDelegate próby budowania CDATA przez dołączenie jej do instancji NSMutableString, tak:

(uwaga: tutaj _currentElement jest właściwość NSString i _factString jest własnością 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]; 
    } 

}