0

より大きなドキュメントを構築するためのテンプレートとして機能する DOM 構造があります。テンプレートは次のようになります (単純化しすぎた例)

<book> // $cache[0]
    <data></data>
    <author></author> // $cache[1]
    <published>
    <company></company> // $cache[3]
    <date></date>
    </published>
    <blurb></blurb>
    <related></related> // $cache[2]
</book>

ご覧のとおり、コストのかかる検索を 1 回だけ実行することを期待して、このテンプレート内の特定のノードをキャッシュします。(テンプレートの基準が厳しいため、この状況では XPath は使用できません。)

上記のテンプレートは、次のようなドキュメントに追加されます。

<store>
    <genre>
    <computing>
        // Insert here
    </computing>
    <nature>
        // Again here
    </nature>
    </genre>
</store>

基本的に、どこにでも挿入できます。解決方法がわからない問題は、appendChildや などのメソッドを使用してテンプレートが挿入された後、キャッシュ ポイントを保持またはすばやく更新する方法insertBeforeです。私が見ることができる唯一の解決策は、挿入されたノードを再検索することですが、前述のように、これにはコストがかかり、最初の検索を支援した特定のタグが削除されます。

dom を反復し、特定のハンドラーでアクションを実行することで、任意のテンプレート エンジンに似た挿入ポイントを見つけます。{{book}}上記のテンプレートを挿入するように要求します。

キャッシュは単純な の配列ですDomNodeが、より優れたクロス ドキュメント メソッドがあれば、これは簡単に変更できます。同様のものを実装したコードへの提案やポインタを受け入れます。

4

1 に答える 1

0

DomNodeをキャッシュするのではなく、ノードへのパスをキャッシュすることでこれを解決しました。最初にノードにgetNodePath()返されるXPathパスを見ましたが、返されたパスを見るだけXPathで、フードの下で多くの分岐を行う必要があることがわかりました。だから私はこれを思いついた:

foreach ( $node->childNodes as $child ) {
    $index++;
    $path = $path . "->childNodes->item($index)";
}

次に、ノードを 2 番目のドキュメントに挿入した後、これらのキャッシュ ポイントをすばやく参照できます。

eval("\$node = \$node$path;");
于 2013-10-05T06:02:13.957 に答える