iphone - 在 iPhone 上解析 XML 的最佳方法

标签 iphone objective-c

我已经熟悉了 iPhone SDK 中的 NSXMLParser,但我发现它的事件驱动特性不适合我的目的。我只想提取一些元素值,但这种必须处理 startElement、foundCharacters 和 endElement 的概念似乎比实际应该做的要多。我只是以错误的方式看待这个问题,还是在 iPhone SDK 中有一种更简单的基于树/DOM 的 XML 处理方式?

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

最佳答案

如果您使用的是 iPhone,使用基于树的解析可能会占用大量内存。相信我,我去过那里,在过去五个月的主要 iPhone 应用程序开发中,我尝试了许多不同的方法。基于树的解析工作正常,直到您下载某人的评论流,其中包含 400 条非常长的评论,原始数据约为 600KB。除了生成的 XML 树的大小之外,创建该树时内部分配的内存也可能非常庞大。

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

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

有关不同解析器的相对内存占用的更多信息(尽管是在 Mac 上,而不是在 iPhone 上),请参阅我的原始博客文章 here以及 NSXMLDocument 上的跟进 here .

关于iphone - 在 iPhone 上解析 XML 的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/842292/

相关文章:

iphone - 如果您在 iTunes Connect 中输入了错误的 bundle ID,该怎么办

iphone - 没有按钮的返回指令?

iphone - 应用程序加载器中的托管内容包是什么?

objective-c - 通过segue传递数据

iOS 11 UISearchBar 背景颜色

iPhone App : How to get default value from root. plist?

ios - 以编程方式获取 iOS 设备的 IMEI 或 UDID

iphone - 在monotouch中使用iphone Objective-C代码的现有代码(monotouch iphone中的范围 slider )

iphone - 如何找出 UITextField 中的当前插入符位置?

objective-c - AQ GridView : Could not call the cellForItemAtIndex method manually