Быстро очистить документ MSXML или создать заново? - PullRequest
0 голосов
/ 30 августа 2009

Существует ли быстрый способ очистить предыдущее содержимое объекта MSXML2.DOMDocument перед повторным использованием? У меня была привычка отбрасывать их и каждый раз создавать новый экземпляр, но мне кажется, что это расточительно, и профилирование нескольких тестовых примеров подтверждает это.

В этом случае я использую MSXML 3.0 для переносимости, и я понимаю, что у этой более старой версии есть некоторые странности, когда речь идет об использовании XPath для выбора больших наборов узлов. Попытка выделить все дерево документа, а затем удалить его, не выглядит чистой и работает не так быстро, как хотелось бы. «Ленивый выбор», используемый MSXML 3.0, также не внушает доверия:

Метод selectNodes

Ранее в MSXML 3.0 и более ранних версиях объект выбора, созданный путем вызова метода selectNodes, постепенно вычислял набор узлов. Если дерево DOM было изменено, в то время как вызов selectNodes все еще активно итерировал его содержимое, поведение могло потенциально изменить узлы, которые были выбраны или возвращены. В MSXML 4.0 и более поздних версиях результат набора узлов полностью рассчитывается во время выбора. Это гарантирует, что итерация проста и предсказуема. В редких случаях это изменение может повлиять на унаследованный код, написанный с учетом предыдущего поведения.

Я также понимаю, что для повторного использования такого объекта необходимо помнить о текущих настройках различных свойств (SelectionLanguage и т. Д.), Которые могут сохраняться между использованиями. Я думаю, что это не должно иметь большого значения, особенно если повторное использование всегда следует одному и тому же шаблону.

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

1 Ответ

2 голосов
/ 05 августа 2011

Вы можете рассмотреть возможность перехода на MSXML6:

  1. Прежде всего, MSXML6 поставляется с WinXP SP3, Vista, Windows Server 2008, Win7 и Windows Server 2008 R2. Единственная поддерживаемая ОС Microsoft, у которой нет MSXML6 в группе, является Windows 2003, где Вы должны позволить клиенту загрузить MSI. В целом, MSXML6 почти такой же портативный, как MSXML3.
  2. В отличие от MSXML3, поддерживающего как XSL Pattern, так и XPath, MSXML6 поддерживает только XPath, где SelectNodes и SelectSingleNode работают только в контексте снимка.
  3. В отличие от GetElementsByTagName, семантика снимка определяется W3C. MSXML6 имеет лучшую производительность и соответствие W3C.

Кроме того, вам не нужно слишком заботиться об очистке документа после каждого использования, поскольку MSXML имеет Сборка мусора внутри, что означает, что вы не получите память обратно при замене элемента документа. Мой совет - примириться с конкретными усилиями по очистке, просто повторно использовать экземпляр для следующей загрузки или перестроить дерево с помощью DOM API. Если использование памяти действительно является серьезной проблемой, XmlLite может предоставить вам полный контроль.

...