5

Web サイト librarything.com から (NSXMLParser を使用して) XML ファイルを解析しようとしています。これは私がこれまでに解析した最初のファイルですが、ほとんどの場合、かなり単純に見えます。私の問題は、CDATA ブロックを解析しようとしたときに発生します。メソッド parser:foundCDATA: が呼び出されず、その理由がわかりません。parser:foundCharacters: メソッドが正常に動作するため、パーサーが適切に設定されていることはわかっています。私が解析しようとしている XML データは次のようになります http://www.librarything.com/services/rest/1.1/?method=librarything.ck.getwork&isbn=030788743X&apikey=d231aa37c9b4f5d304a60a3d0ad1dad4属性を持つ要素内で CDATA ブロックが発生します名前「説明」。

メソッドが呼び出されない理由についての助けをいただければ幸いです。

編集: 記述 CDATA ブロックで parser:foundCharacters: メソッドを実行したところ、"<" が返されました。これは、パーサーが CDATA タグを正しく認識していないことを意味していると思います。これを修正するために私の側でできることはありますか?

4

1 に答える 1

2

タグのCDATAコンテンツは、の<fact>複数のコールバックで段階的に返されているようparser:foundCharactersです。NSXMLParserDelegateに準拠しているクラスで、次のようにNSMutableStringインスタンスに追加してCDATAを構築してみてください。

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

}
于 2012-10-05T22:50:19.703 に答える