1

文档对象模型(DOM)用于表示xmlhtml

但是我无法理解为什么 DOM 将所有内容都加载到主内存中。它是用于使我们能够在其中插入、删除对象还是有其他东西..

还有它的优点是什么,使它的用途如此广泛

4

3 回答 3

4

因为能够实现诸如

document.getElementsByTagName("foo");

您需要完全解析文档,并将节点树加载到内存中。您可以在每次方法调用时成像重新解析文档,但这会非常低效。

它如此受欢迎的原因在于它是一个标准的 API,受到地球上所有语言的支持,这使得浏览节点和提取所需信息变得相对容易。

于 2013-02-08T17:50:09.007 回答
1

XML 文档本质上是一个树结构。一次将整个树加载到内存中很方便。对于某些 XML 模式尤其如此,其中某些节点依赖于树的其他部分。这就是完整加载文档的优点。这也意味着应用 XSLT 转换之类的操作得到了简化——并且可以说性能更高,因为文档已经在内存中。不再需要 I/O(而且由于大多数应用程序受 I/O 限制而不是 CPU 限制,这是一件好事。)

缺点包括:

  • 速度。在加载整个文档之前,您无法访问它。对于非常大的文档尤其如此。
  • 内存使用情况。对于大型文档,消耗的内存量可能是一个问题,增加了系统上的分页。
  • 有效性。如果文档在语法上无效或无法针对架构进行验证,那么即使它 95% 有效,它也可能完全无法使用。根据上下文,这可能是也可能不是问题。对于加载可能包含大量语法/模式错误的随机 HTML 文档之类的内容,这是一个问题:正确加载文档需要大量错误处理和内置假设(对于“正确”的某些定义)。

像 SAX 这样的事件驱动解析策略更简单。但是,它要求解析使用者以一种在内存中维护完整文档结构不需要的方式跟踪状态。此外,它几乎是单程操作。如果消费者需要回溯文档以达到预期的效果......消费者将需要维护这样做所需的堆栈。但是,事件驱动的解析使用的内存要少得多,它可能会在解析事件开始引发时立即处理,而且它更简单(因为它会将大量工作传递给消费者)。

我不相信你可以说一个另一个好。它们只是不同的方法。根据上下文,一种或另一种方法可能更适合手头的问题。

有人可能会争辩说,将整个文档加载到内存中的 XML 解析器只是底层事件驱动的 SAX 样式解析器的通用消费者。这是否属实,我不知道,但肯定可以这样做。

于 2013-02-08T18:05:18.900 回答
1

DOM 就是这样 - 对象模式,一种访问某些东西的方式。

在大多数情况下,例如在浏览器中加载的 HTML 文档已经加载到内存中,而 DOM 只是让您以易于理解的方式访问它。

当您在文档上实现 DOM 时,对您没有明确的限制。隐含的期望是迭代子节点将是线性的,并且在树中向上/向下将是恒定时间。通常,将整个文档加载到内存中以满足期望是最容易的,但您不必这样做。

于 2013-02-08T18:05:56.290 回答