2012-07-15 5 views
5

웹 사이트 librarything.com에서 XML 파일 (NSXMLParser 사용)을 구문 분석하려고합니다. 이것은 내가 지금까지 파싱 한 첫 번째 파일이지만, 대부분은 상당히 똑바로 보인다. 내 문제는 CDATA 블록을 구문 분석하려고 할 때 발생합니다. 메서드 파서 : foundCDATA :가 호출되지 않아 이유를 이해할 수 없습니다. 파서 : foundCharacters : 메서드가 제대로 작동하기 때문에 파서가 올바르게 설정되었음을 압니다. 구문 분석하려고하는 XML 데이터는 http://www.librarything.com/services/rest/1.1/?method=librarything.ck.getwork&isbn=030788743X&apikey=d231aa37c9b4f5d304a60a3d0ad1dad4이고 CDATA 블록은 특성 이름이 "description"인 요소 내부에서 발생합니다.XML CDATA 블록 구문 분석

이 메소드가 호출되지 않는 이유에 대한 도움은 크게 감사하겠습니다!

EDIT : 설명 CDATA 블록에서 파서 : foundCharacters : 메소드를 실행하고 "<"을 반환했습니다. 파서가 CDATA 태그를 올바르게 보지 못했다는 것을 의미합니다. 이 문제를 해결하기 위해 끝까지 할 수있는 일이 있습니까?

답변

2

<fact> 태그의 CDATA 내용이 parser:foundCharacters의 여러 콜백을 통해 점차적으로 반환됩니다.

: 당신이 클래스에서는과 같이, 인 NSMutableString 인스턴스에 추가하여 CDATA을 구축하려고 NSXMLParserDelegate에 부합하는 곳 (참고 : 여기 _currentElement가있는 NSString 속성이고 _factString는 인 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]; 
    } 

}