5

我正在尝试从网站 librarything.com 解析 XML 文件(使用 NSXMLParser)。这是我解析过的第一个文件,但在大多数情况下,它看起来相当简单。尝试解析 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

似乎<fact>标签中的 CDATA 内容正在通过parser:foundCharacters. 在符合 NSXMLParserDelegate 的类中,尝试通过将 CDATA 附加到 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 回答