2010-06-02 44 views
0

我使用的是周圍的PHP5級DOM文檔的一個包裝生成HTML我以後工作了。這使得使用DOM修改HTML變得很容易。的DOMNode參考不追加到另一個元素兩次

一個例子是創建元素#1和將其添加到元件#2,並且仍然能夠直接修改元件#1。

甲問題然而產生了以下內容:

  • 元#1被添加到元件#2
  • 元#2加入到元件#3
  • 元#1被修改,但不改變是在元件#3的DOM可見(其包含#1和#2)

的簡化示例代碼:

<?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正確的節點?

回答

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

在這裏,您製作了$ el2的深層副本,即您還製作了$ e1的副本,您將其附加到$ e2。當您稍後更改$ e1的節點值時,它不影響$ e1的克隆/深層副本。

+0

啊。我懂了。 $ el2是實際添加到$ el3的深層副本。因此修改$ el2也反映在$ el3的DOM中。 在這種情況下,我需要一些通用的方法來$ EL1設置爲$ EL3的DOM相應的節點。我編輯了原始問題。 – dutchmega 2010-06-02 19:09:20

+0

無論如何,結果是一個_valid_ XHTML文檔嗎? – VolkerK 2010-06-02 21:16:24

相關問題