将DOMNode引用两次附加到另一个元素后,它不再起作用

时间:2010-06-02 17:52:03

标签: php html dom domdocument

我正在使用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中的右边节点?

1 个答案:

答案 0 :(得分:0)

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

在这里你制作了一个$ el2的深层副本,也就是你还要附上$ e1的副本,你附加到$ e2。当您稍后更改$ e1的节点值时,它不会影响$ e1的克隆/深层副本。