使用NSXMLParser解析包含CDATA的内容

12
我正在使用NSXMLParser解析一个RSS源,对于标题和其他字符串来说都很好用,但其中一个元素是像这样的图像

<!CDATA <a href="http:image..etc> 

我该如何将其添加为表格视图中的单元格图片?我需要将其定义为图像类型吗?

这是我用来进行解析的代码:

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{            
//NSLog(@"found this element: %@", elementName);
currentElement = [elementName copy];
if ([elementName isEqualToString:@"item"]) {
    // clear out our story item caches...
    item = [[NSMutableDictionary alloc] init];
    currentTitle = [[NSMutableString alloc] init];
    currentDate = [ [NSMutableString alloc] init];
    currentSummary = [[NSMutableString alloc] init];
    currentLink = [[NSMutableString alloc] init];
}

}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{     
//NSLog(@"ended element: %@", elementName);
if ([elementName isEqualToString:@"item"]) {
    // save values to an item, then store that item into the array...
    [item setObject:currentTitle forKey:@"title"];
    [item setObject:currentLink forKey:@"link"];
    [item setObject:currentSummary forKey:@"description"];
    [item setObject:currentDate forKey:@"date"];

    [stories addObject:[item copy]];
    NSLog(@"adding story: %@", currentTitle);
}

}


这是一个简单的HTML段落,其中包含了一个右括号字符“}”。
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
//NSLog(@"found characters: %@", string);
// save the characters for the current item...
if ([currentElement isEqualToString:@"title"]) {
    [currentTitle appendString:string];
} else if ([currentElement isEqualToString:@"link"]) {
    [currentLink appendString:string];
} else if ([currentElement isEqualToString:@"description"]) {
    [currentSummary appendString:string];
} else if ([currentElement isEqualToString:@"pubDate"]) {
    [currentDate appendString:string];
}

}


这是一个简单的HTML标记,表示结束符号“}”。它通常用于编程语言中的代码块或对象的关闭。
2个回答

21

你可以使用

- (void)parser:(NSXMLParser *)parser foundCDATA:(NSData *)CDATABlock
{
    NSString *someString = [[NSString alloc] initWithData:CDATABlock encoding:NSUTF8StringEncoding];
}

这个很棒。如果你需要进一步解析,只需创建另一个解析器即可。 - Mariano
这将是大多数人寻找工作完成的答案。很明显,initWithData不会从找到的NSData中提供有效的字符串,但当你看到它时,你会说“噢!” :) 对我有用,+1。 - Henrik Erlandsson
@Gabriel,请查看我的问题http://stackoverflow.com/questions/43539307/how-to-post-string-with-special-character-using-xml-parsing-in-objective-c。我该如何使用你的代码? - Muju

4

CDATA的作用是将其内部的内容视为XML文档的一部分。

因此,如果在CDATA中有标签,则解析器将忽略它们。

我猜测这个CDATA在描述元素中。因此,您需要手动或通过另一个解析器实例从“描述”元素中提取标签。


是的,其中有一个图像URL。我如何使用NSXMLParser提取图像URL? - Xcoder
看一下 CDATA 部分中的字符串。如果它总是有效的 XML,则在 字符串上启动另一个 NSXMLParser 实例。如果它不是有效的 XML,则您将不得不做其他事情™,例如手动查找标记。 - Justicle
像WordPress这样的CMS在CDATA标签中有描述。 iPhone编码人员可能会被要求在他的应用程序的RSS阅读器部分显示描述文本,就像所有的RSS阅读器一样。 GabrielN的答案是解决方案。 - Henrik Erlandsson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接