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 の正しいノードに直接ポイントする一般的な方法はありますか?