繁体   English   中英

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

[英]why DOM (Document Object Model) loads everything into main memory

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

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

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

因为能够实现诸如

document.getElementsByTagName("foo");

您需要完全解析文档,并将节点树加载到内存中。 您可以在每次方法调用时想象重新解析文档的过程,但是这样做效率极低。

它之所以如此流行,是因为它是标准的API,受到地球上每种语言的支持,并且相对容易浏览节点并提取所需的信息。

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

缺点包括:

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

像SAX这样的事件驱动的解析策略更简单。 但是,它要求解析使用者以不维护内存中完整文档结构的方式跟踪状态。 此外,这几乎是单遍操作。 如果使用者需要回溯文档以实现所需的效果,则使用者将需要维护执行此操作所需的堆栈。 但是,事件驱动的解析使用的内存要少得多,一旦解析事件开始引发且解析起来就简单得多(因为它将大量的工作传递给使用者),就可以对其进行处理。

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

有人可能会说将整个文档加载到内存中的XML解析器只是事件驱动的SAX样式解析器的通用用途。 我不知道这是否是正确的,但肯定可以那样做。

DOM就是对象模式,一种访问某些内容的方式。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM