我有这个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中将它用于另一个解析器。
答案 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元素的参数。