gpt4 book ai didi

objective-c - 解析 XML CDATA block

转载 作者:数据小太阳 更新时间:2023-10-29 01:58:36 25 4
gpt4 key购买 nike

我正在尝试从网站 librarything.com 解析一个 XML 文件(使用 NSXMLParser)。这是我解析过的第一个文件,但在大多数情况下它看起来相当简单。我的问题发生在尝试解析 CDATA block 时;方法 parser:foundCDATA: 没有被调用,我不明白为什么。我知道我的解析器设置正确,因为 parser:foundCharacters: 方法工作正常。我试图解析的 XML 数据看起来像这样 http://www.librarything.com/services/rest/1.1/?method=librarything.ck.getwork&isbn=030788743X&apikey=d231aa37c9b4f5d304a60a3d0ad1dad4 CDATA block 出现在属性名称为“description”的元素内。

如能提供有关为何未调用该方法的任何帮助,我们将不胜感激!

编辑:我在描述 CDATA block 上运行了 parser:foundCharacters: 方法,它返回了“<”。我假设这意味着解析器没有正确看到 CDATA 标记。我可以做些什么来解决这个问题吗?

最佳答案

它出现在 <fact> 中的 CDATA 内容标签在 parser:foundCharacters 中的多个回调中逐渐返回.在您符合 NSXMLParserDelegate 的类(class)中​​,尝试通过将 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];
}

}

关于objective-c - 解析 XML CDATA block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11488344/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com