【问题标题】:iOS XML Parsing many documentsiOS XML解析许多文档
【发布时间】:2012-09-08 15:23:17
【问题描述】:

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

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

【问题讨论】:

  • 你可以有单独的类实例,或者如果它更简单,使用带有 libxml2 的 DOM 解析器
  • 你最后做了什么?

标签: iphone objective-c ios xml nsxmlparser


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢,我喜欢这种方法,因为它符合我对“干净”设计的理解。不幸的是,创建 XML 文档的人并不认为是非常面向对象的.. 但我会尝试解决这个问题。
【解决方案2】:

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

【讨论】:

  • 嘿,谢谢你的回复。虽然您的解决方案可能会更简单,但我最终选择了 bryanmacs 方法,主要是因为我想首先对 xml 处理有一个扎实的理解。
猜你喜欢
  • 1970-01-01
  • 2020-07-10
  • 1970-01-01
  • 2016-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-17
  • 2017-06-24
相关资源
最近更新 更多