iOS XML解析许多文档

时间:2012-09-08 15:23:18

标签: iphone objective-c ios xml nsxmlparser

在我的应用程序中,我需要做几个HTTP请求。所有这些请求都返回需要解析的XML-Documents,然后进入表视图或其他任何内容......整个应用程序中大约有10-20个文档。具有相同名称的属性可以出现在不同的文档中,因此我需要在我的委托方法中区分这些属性。

我的方法是只有一个类使用NSXMLParserDelegate方法,每个文档使用不同的解析器(但使用相同的委托),并使用委托方法中的parser-argument区分解析器(也称为文档)。但这变得非常复杂,我不想结束大量不同的解析器实例变量和if子句。 有没有更简单的方法来做到这一点?我想每次解析操作有1个类(=>不同的代表),但我想这更糟糕..

2 个答案:

答案 0 :(得分:2)

一种选择是将XML委托回调和/或数据构造方法放在将通过解析特定xml类型而创建的对象上。这将放置对象的定义以及如何在一个地方从xml或数据块创建它的知识。通过尝试将所有类型的所有解析逻辑放在一个委托方法中,它会使一个委托类复杂化并分割您正在使用的每个类型的知识。

该方法的一个挑战是复合对象。例如,如果您有一个艺术家对象,一个包含艺术家的专辑对象,以及一个获取艺术家列表的调用。一种方法是使解析的复合对象遵循其他对象类(可能使用您自己的协议)。例如,专辑对象正在解析并命中“艺术家”元素。所以它知道分配一个艺术家并且当它从委托回调中击中数据块(直到它击中关闭的艺术家元素) - 它将继续调用你的协议方法填充数据。这推迟知道如何处理该块数据到定义该对象的类。对于正在处理艺术家列表的类,它将完成此操作n次构建列表。获得一位艺术家(艺术家类的代表)的调用仍会在艺术家对象上调用那些状态数据块填充方法。

最后,在解析XML时构造对象,如果操作正确,可以保持内存更低并且执行速度更快。相反,缓冲完整的XML字符串,创建一个完整的XML DOM可以使用更多的内存,这对用户来说也可能更慢。所以,也要考虑性能。

答案 1 :(得分:0)

如果您的XML只是为一堆记录编码,请查看https://github.com/ZaBlanc/RaptureXML在RaptureXML中,您可以使用块进行解析,因此您不必担心自己创建新对象。您可以将文档的名称作为参数传递给解析块。它比使用NSXMLParser简洁一百万倍。