的NSXMLParser foundCDATA特定元素

问题描述:

我有这个XML文件:的NSXMLParser foundCDATA特定元素

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

我怎样才能获得CDATA每个元素,并将其保存到每一个的NSMutableDictionary? 在foundCDATA委托中没有要比较的元素名称。

我想这行foundCharacters:

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

,但我得到零,因为我使用它在同一视图 - 控制另一个解析器我不能删除foundCDATA代表。

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

然后,你将有机会获得:

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

您的解析器代表先前会收到-parser:didStartElement:namespaceURI:qualifiedName:attributes:元素。它应该使用它来更新它的状态,以便它知道当下一条消息进来时,什么元素被解析。无论消息是-foundCDATA:还是-foundCharacters:或别的东西,情况都是如此。

你可以一个实例变量(如的NSString * currentElement)添加到委托类,然后将此代码添加到委托设置变量的值foundCDATA中当前元素的名称。

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

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