Sco*_*ski 5 xml parsing objective-c cdata nsxmlparser
我正在尝试从网站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块出现在具有属性的元素内名称"描述".
任何有关为什么不调用该方法的帮助将不胜感激!
编辑:我在描述CDATA块上运行了解析器:foundCharacters:方法,它返回"<".我假设这意味着解析器没有正确地看到CDATA标签.我可以做些什么来解决这个问题吗?
看起来<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];
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1823 次 |
最近记录: |