2

我有这个 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 委托,因为我将它用于同一视图控制器中的另一个解析器。

4

3 回答 3

2

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

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

于 2012-05-27T06:07:55.947 回答
0

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

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

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

于 2012-05-27T06:06:54.927 回答
0

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

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

于 2012-05-27T06:22:36.153 回答