2013-02-08 2 views
1

Document Object Model (DOM) используется для представления xml, htmlпочему DOM (Document Object Model) загружает все в основную память

Но я не в состоянии понять, почему DOM загружает все в основные memory.Is он используется позволяя нам вставлять, удалять в нем объекты или есть что-то еще.

Также в чем его преимущества, поэтому его использование wide?

+1

Если вы не хотите загружать все это, вместо этого используйте синтаксический анализатор SAX. DOM API - это в основном случайный доступ, поэтому он одновременно загружает весь XML. Анализ SAX является последовательным и загружает информацию по мере необходимости в порядке w.r.t. XML. – Brian

+0

@Brian Я знаю, что..Я хочу знать о DOM .. – 2013-02-08 17:48:45

+0

Это в основном то, что вы сказали. DOM загружает все, потому что вы можете выборочно обращаться и изменять XML и переходить между, скажем, узлами 1 и 4 в дочернем списке. Это жертва памяти за скорость. – Brian

ответ

4

Потому, чтобы иметь возможность реализовать метод, такой как

document.getElementsByTagName("foo"); 

вам необходимо иметь проанализирован документ полностью, и загружается дерево узлов в памяти. Вы могли бы визуализировать репарацию документа при каждом вызове метода, но это было бы крайне неэффективно.

Что делает его настолько популярным, так это то, что он является стандартным API, поддерживаемым всеми языками на земле, и что позволяет относительно легко перемещаться по узлам и извлекать нужную информацию.

+0

+1 Не только извлекать информацию, но и изменять информацию. – Brian

1

XML-документ по существу представляет собой древовидную структуру. удобный для загрузки всего дерева в память сразу. Это особенно верно в некоторых XML-схемах, где определенные узлы зависят от других частей дерева. В этом преимущества загрузки документа целиком. Это также означает, что операции, такие как применение преобразования XSLT, упрощаются — и, возможно, более эффективны, поскольку документ уже находится в памяти. Ввод/вывод больше не требуется (и так как большинство приложений ввод/вывод, а не связан процессор переплета, это не хорошо.)

К недостаткам можно отнести:

  • Скорости. Пока весь документ не будет загружен, вы не сможете получить к нему доступ. Особенно это касается очень больших документов.
  • Использование памяти. Для больших документов объем потребляемой памяти может быть проблемой, увеличивая пейджинг в системе.
  • Срок действия. Если документ синтаксически недействителен или не может быть проверен против схемы, он, вероятно, полностью непригоден, даже если он действителен на 95%. В зависимости от контекста это может быть или не быть проблемой. И для загрузки чего-то вроде случайного HTML-документа, который, вероятно, содержит множество ошибок синтаксиса/схемы, это проблема: для правильной загрузки документа потребуется много обработки ошибок и встроенных в него допущений (для некоторого определения «правильно»)).

Стратегия синтаксического анализа, управляемая событиями, такая как SAX, проще. Это требует, однако, чтобы пользователь синтаксического анализа отслеживал состояние таким образом, что сохранение полной структуры документа в памяти не происходит. Кроме того, это в значительной степени однопроходная операция. Если потребителю необходимо вернуться к документу для достижения желаемого эффекта ... потребитель должен будет поддерживать стек, необходимый для этого. Тем не менее, обработчик, управляемый событиями, использует гораздо меньше памяти, его можно обработать, как только события синтаксического разбора начнут подниматься, а его намного проще (поскольку он передает большую часть работы потребителю).

Я не верю, что вы можете сказать один: лучше, чем другой; это просто разные подходы. В зависимости от контекста один или другой подход может лучше подходить к проблеме.

Можно утверждать, что парсер XML, который загружает весь документ в память, является просто универсальным потребителем синтаксического анализатора SAX в стиле событий под капотом. Верно это или нет, я не знаю, но, конечно, можно так поступить.

1

DOM это просто - объектный режим, способ доступа к чему-либо.

В большинстве случаев, как в HTML, загруженном в документ браузера, уже загружается в память, а DOM просто позволяет вам легко получить доступ к нему.

У вас нет явных ограничений при реализации DOM над документом. Неявное ожидание заключается в том, что итерирование дочерних узлов будет линейным, а движение вверх/вниз в дереве будет постоянным. Как правило, проще всего загрузить весь документ в память, чтобы удовлетворить ожидания, но вам этого не нужно.