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 回答