1

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

我的方法是只有 1 个具有 NSXMLParserDelegate 方法的类,每个文档使用不同的解析器(但具有相同的委托),并使用委托方法中的解析器参数区分解析器(又名文档)。但这变得相当复杂,我不想以大量不同的解析器实例变量和 if 子句告终。没有更简单的方法可以做到这一点吗?我想每个解析操作有 1 个类(=> 不同的代表),但我想那更糟..

4

2 回答 2

2

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

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

最后,在解析 XML 时构造对象,如果操作正确,可以降低内存并提高执行速度。相比之下,缓冲完整的 xml 字符串,创建完整的 XML DOM 可以使用更多的内存,这对用户来说也可能更慢。因此,还要考虑性能。

于 2012-09-08T15:53:31.110 回答
0

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

于 2012-09-08T15:44:51.497 回答