NSXMLParser为特定元素找到了CDATA

时间:2012-05-27 05:15:12

标签: iphone nsxmlparser

我有这个XML文件:

<item>
<title>App1</title>
<link><![CDATA[SomeLink]]></link>
<description><![CDATA[SomeText]]></description>
</item>

如何获取每个元素的CDATA并将其保存到每个NSMutableDictionary? 在foundCDATA委托中没有要比较的elementName。

我在foundCharacters中尝试了这一行:

if ([currentElement isEqualToString:@"link"]) [currentLink appendString:string];

但是我得到了nil,我无法删除foundCDATA委托,因为我在相同的viewcontroller中将它用于另一个解析器。

3 个答案:

答案 0 :(得分:2)

  

在foundCDATA委托中没有要比较的elementName。

您的解析器委托之前已收到-parser:didStartElement:namespaceURI:qualifiedName:attributes:元素。它应该使用它来更新它的状态,以便知道在下一条消息进入时正在解析的元素。无论消息是-foundCDATA:还是-foundCharacters:还是某事都是如此其他

答案 1 :(得分:0)

您可以将一个实例变量(例如NSString * currentElement)添加到委托类,然后通过将此代码添加到委托来设置该变量的值:

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
    currentElement = elementName;
}

然后,您将可以访问foundCDATA中当前元素的名称。

答案 2 :(得分:0)

最好的(更准确地说是最一般的)方法是以某种方式从嵌套元素构建堆栈;实际上,这将使您能够在解析期间从XML文档的顶部到底部查看整个结构。在构建RSS解析器时看看我是如何做到的:https://github.com/H2CO3/RSSKit/blob/master/RSSParser.m

基本上,您需要做的是实现parser:didStartElement:等和parser:didEndElement:(为简单起见,我没有输入完整的选择器名称)。然后维护一串类似Unix的文件路径(这就是我正在做的)在前一个方法中添加一个组件并在后一个方法中删除它,或者你可以构建一个NSMutableArray甚至是一个自定义堆栈对象来推送必要的XML元素的参数。