在iPhone上进行XML解析的最佳方法

Mar*_*oft 5 iphone objective-c

我已经熟悉了iPhone SDK中的NSXMLParser,但我发现它的事件驱动性质对我来说很尴尬.我只是想提取一些元素值,但是这个必须处理startElement,foundCharacters和endElement的概念似乎比实际应该更多的工作.我只是以错误的方式看待这个问题,还是在iPhone SDK中使用XML更简单的基于树/ DOM的方式?

如果建议只是使用NSXMLParser,是否有某些设计模式可以用来保持我的代码在startElement方法中没有5级嵌套ifs?

Jim*_*vey 10

如果你在iPhone上,使用基于树的解析可能是一个令人望而却步的记忆力.相信我,我一直在那里,并且在我的主要iPhone应用程序开发的最后五个月里,我尝试了许多不同的方法.基于树的解析工作正常,直到您下载包含400条非常长的注释的某人​​的评论流,大约600KB的原始数据.除了生成的XML树的大小之外,在创建该树时内部分配的内存可能是巨大的.

我最终创建了一个NSXMLParser的变体,它从提供的NSInputStream中提取数据,而不是使用单个数据块,并且一次只传递1KB到libxml进行处理(NSXMLParser也使用libxml,但传递了100%的数据)一气呵成).

源代码在github上可用(查看StreamingXMLParser文件夹).你还会在那里找到一个委托超类; 对于大多数解析需求,您可以继承AQXMLParserDelegate -start[Element]WithAttributes: (NSDictionary *) attrs-end[Element]在子类中实现它.这些方法将在发现起始和结束标记时为您调用,并且在结束标记内可用于self.characters访问元素的内容字符或CDATA.

欲了解更多的不同的解析器的相对内存占用(尽管在Mac上,而不是iPhone)看我原来的博客文章在这里和NSXMLDocument的随访这里.