2012-07-15 16 views
5

Webサイト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に返されているようです。

(注:ここで_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]; 
    } 

} 
あなたはNSXMLParserDelegateに準拠しているあなたのクラスではそのように、NSMutableStringインスタンスにそれを追加することによって、CDATAを構築してみてください