我已经熟悉了 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/