0

PHP5 クラスの DOMDocument のラッパーを使用して HTML を生成しています。これにより、DOM を使用して HTML を簡単に変更できます。

たとえば、要素 #1 を作成して要素 #2 に追加しても、要素 #1 を直接変更することができます。

ただし、次の場合に問題が発生します。

  • 要素 #1 が要素 #2 に追加されます
  • 要素 #2 が要素 #3 に追加されます
  • 要素 #1 は変更されていますが、要素 #3 (#1 と #2 を含む) の DOM には変更が表示されません。

簡単なサンプル コード:

<?php
$doc1 = new DOMDocument();
$el1 = $doc1->createElement('h1', 'Hello');
$doc1->appendChild($el1);

$doc2 = new DOMDocument();
$el2 = $doc2->createElement('h2', 'World');
$doc2->appendChild($el2);

$doc3 = new DOMDocument();
$el3 = $doc3->createElement('h3', 'Today');
$doc3->appendChild($el3);

// Import el1 into el2
$el1 = $doc2->importNode($el1, true);
$el2->appendChild( $el1 );
$doc1 = $doc2;

// Import el2 into el3
$el2 = $doc3->importNode($el2, true);
$el3->appendChild($el2);
$doc2 = $doc3;

// Modify el1
$el1->nodeValue = "Boo"; // This doesn't work?
//$el2->nodeValue = "Boo"; // Changing element2 or 3 works...

// Display result
echo $doc3->saveHTML();
?>`

$el2 はディープ コピーされ、$el3 の DOM に追加されるため、変更することは可能です。ただし、$el1 は依然として $doc2/$el2 の DOM を指しており、変更は $el3 の DOM には反映されません。

$el1 を $el3 の DOM の正しいノードに直接ポイントする一般的な方法はありますか?

4

1 に答える 1

0
$el2 = $doc3->importNode($el2, true);

ここで $el2 のディープ コピーを作成します。つまり、$e2 に追加した $e1 のコピーも作成します。後で $e1 のノード値を変更しても、$e1 のクローン/ディープ コピーには影響しません。

于 2010-06-02T18:30:01.760 に答える