为什么DOM(文档对象模型)将所有内容加载到主内存中

时间:2013-02-08 17:45:58

标签: c# java dom

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

但我无法理解为什么DOM会将所有内容加载到主内存中。它是否用于使我们能够插入,删除其中的对象或者还有其它内容。

还有什么优势使得它的使用如此

3 个答案:

答案 0 :(得分:4)

因为能够实现诸如

之类的方法
document.getElementsByTagName("foo");

您需要完全解析文档,并在内存中加载节点树。您可以在每次方法调用时对文档进行重新映射,但效率极低。

它如此受欢迎的原因在于它是一种标准的API,受到地球上所有语言的支持,并且可以相对轻松地浏览节点并提取所需的信息。

答案 1 :(得分:1)

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

缺点包括:

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

像SAX这样的事件驱动的解析策略更简单。但是,它要求解析消费者以保持内存中的完整文档结构的方式跟踪状态。此外,它几乎是一次通过操作。如果消费者需要回溯整个文档以达到预期的效果......消费者将需要维护这样做所需的堆栈。但是,事件驱动的解析使用的内存要少得多,只要解析事件开始提升就可以处理它,并且它更简单(因为它将大量工作传递给消费者)。

我不相信你可以说一个人比另一个人更好;他们只是不同的方法。根据具体情况,一种或另一种方法可能更适合手头的问题。

有人可能会争辩说,将整个文档加载到内存中的XML解析器只是一个事件驱动的SAX风格解析器的通用消费者。不管是不是真的,我不知道,但是当然可以这样做。

答案 2 :(得分:1)

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

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

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