0

再利用する前に、MSXML2.DOMDocument オブジェクトの以前のコンテンツをクリアする簡単な方法はありますか? 私はそれらを破棄して毎回新しいインスタンスを作成する習慣がありましたが、これは無駄だと思い、いくつかのテストケースをプロファイリングするとこれが確認されるようです.

この場合、移植性のために MSXML 3.0 を使用していますが、この古いバージョンには、XPath を使用して大量のノード セットを選択する場合にいくつかの癖があることに気付きました。ドキュメント ツリー全体を選択してから削除しようとすると、きれいに感じられず、思ったほど速く動作しません。MSXML 3.0 が使用する "怠惰な選択" も自信を持たせません。

selectNodes メソッド

以前は、MSXML 3.0 以前のバージョンでは、selectNodes メソッドを呼び出すことによって作成された選択オブジェクトがノード セットを徐々に計算していました。DOM ツリーが変更された場合、selectNodes 呼び出しがまだそのコンテンツをアクティブに反復している間に、選択または返されたノードが動作によって変更される可能性がありました。MSXML 4.0 以降では、ノード セットの結果は選択時に完全に計算されます。これにより、反復が単純で予測可能になります。まれに、この変更により、以前の動作に対応するために記述されたレガシー コードが影響を受ける場合があります。

また、このようなオブジェクトを再利用するには、使用するまでに残る可能性があるさまざまなプロパティ (SelectionLanguage など) の現在の設定に注意する必要があることも認識しています。ただし、特に再利用が常に同じパターンに従う場合は、大したことではないと思います。

私が求めているのは、ロードされた DOM をクリアして再利用するためのクリーンで迅速な方法、または再利用が再作成の代替手段よりも悪い理由についてのより多くの入力であると思います。

4

1 に答える 1

2

MSXML6 への移行を検討してください。

  1. まず、MSXML6 は WinXP SP3、Vista、Windows Server 2008、Win7、および Windows Server 2008 R2 に同梱されています。Microsoft がサポートする OS で MSXML6 が帯域内にない唯一の OS は Windows 2003 であり、顧客に MSI をダウンロードさせる必要があります。全体として、MSXML6 は MSXML3 とほぼ同じくらい移植性があります。
  2. XSL パターンと XPath の両方をサポートする MSXML3 とは異なり、MSXML6 は XPath のみをサポートし、SelectNodes と SelectSingleNode はスナップショットのコンテキストでのみ機能します。
  3. GetElementsByTagName とは異なり、スナップショットのセマンティクスは W3C によって定義されています。MSXML6 はパフォーマンスが向上し、W3C に準拠しています。

また、MSXML にはガベージ コレクションが内部にあるため、使用後にドキュメントをクリーンアップすることについてあまり気にする必要はありません。つまり、ドキュメント要素を置き換えてもメモリを取り戻すことはできません。私のアドバイスは、次のロードのためにインスタンスを再利用するか、DOM API を使用してツリーを再構築するだけで、特定のクレンジング作業を行うことです。メモリ使用量が本当に大きな問題である場合は、XmlLiteを使用して完全に制御できます。

于 2011-08-05T15:55:53.833 に答える