文档对象模型(DOM)用于表示xml
,html
但我无法理解为什么DOM会将所有内容加载到主内存中。它是否用于使我们能够插入,删除其中的对象或者还有其它内容。
还有什么优势使得它的使用如此宽?
答案 0 :(得分:4)
因为能够实现诸如
之类的方法document.getElementsByTagName("foo");
您需要完全解析文档,并在内存中加载节点树。您可以在每次方法调用时对文档进行重新映射,但效率极低。
它如此受欢迎的原因在于它是一种标准的API,受到地球上所有语言的支持,并且可以相对轻松地浏览节点并提取所需的信息。
答案 1 :(得分:1)
XML文档本质上是一种树结构。一次将整个树加载到内存中方便。对于某些XML模式尤其如此,其中某些节点依赖于树的其他部分。这是整个加载文档的优点。它还意味着应用XSLT转换等操作得到了简化 - 并且由于文档已经在内存中,因此可以说性能更高。不再需要I / O(因为大多数应用程序都是I / O绑定而不是CPU绑定,这是一件好事。)
缺点包括:
像SAX这样的事件驱动的解析策略更简单。但是,它要求解析消费者以保持内存中的完整文档结构的方式跟踪状态。此外,它几乎是一次通过操作。如果消费者需要回溯整个文档以达到预期的效果......消费者将需要维护这样做所需的堆栈。但是,事件驱动的解析使用的内存要少得多,只要解析事件开始提升就可以处理它,并且它更简单(因为它将大量工作传递给消费者)。
我不相信你可以说一个人比另一个人更好;他们只是不同的方法。根据具体情况,一种或另一种方法可能更适合手头的问题。
有人可能会争辩说,将整个文档加载到内存中的XML解析器只是一个事件驱动的SAX风格解析器的通用消费者。不管是不是真的,我不知道,但是当然可以这样做。
答案 2 :(得分:1)
DOM就是那种 - 对象模式,一种访问某种东西的方式。
在大多数情况下,如在浏览器文档中加载的HTML已经加载到内存中,而DOM只是让您可以轻松地以理解的方式访问它。
在文档上实现DOM时,没有明确的限制。隐含的期望是迭代子节点将是线性的并且在树中上/下将是恒定时间。通常,将整个文档加载到内存中以满足期望是最简单的,但您不必这样做。