2011-06-10 107 views
0

我在我的腳本中有奇怪的行爲。這有我困惑php domdocument異常加載HTML文件

腳本1.

$dom = new DOMDocument(); 
$dom->loadHTMLFile("html/signinform.html");//loads file here 
$form = $dom->getElementsByTagName("form")->item(0); 
$div = $dom->createElement("div"); 
$dom->appendChild($div)->appendChild($form); 
echo $dom->saveHTML(); 

腳本2.

$dom = new DOMDocument(); 
$div = $dom->createElement("div"); 
$dom->loadHTMLFile("html/signinform.html");//loads file here 
$form = $dom->getElementsByTagName("form")->item(0); 
$dom->appendChild($div)->appendChild($form); 
echo $dom->saveHTML(); 

腳本1工作沒有問題。它顯示了表單。然而腳本2拋出以下錯誤:致命錯誤:未捕獲的異常「拋出:DOMException」在C消息「錯誤文檔錯誤」:\用戶

有人能向我解釋爲什麼的loadHTMLFile的位置僅僅改變函數導致這樣的錯誤?謝謝

回答

1

您已經向DOM添加了一個元素(div),然後嘗試加載要解析的文件及其使用的DOM結構。

如果您打算使用文件,請先加載文件。

+0

所以你的意思是,在每個腳本我必須首先加載文件? – 2011-06-10 05:37:18

+0

@Camilo是的。你有什麼打算首先創建'dom'元素? – alex 2011-06-10 05:38:07

+0

我只是認爲我可以從現有的html文件動態加載div的片段,然後將它們插入到DOM所需的位置。 – 2011-06-10 05:39:58

0

對於DOM操作你不需要插入一個已經存在的元素,以便做這樣的事情:$dom->appendChild($form)只有重新插入相同的表單元素,當你拉使用$dom->getElementsByTag("form")->item(0)它成爲一個元素它自己的DOM對象,你可以直接引用,並附加到。一個適當的例子是:

$dom = new DOMDocument(); 
$dom->loadHTMLFile("assets/dom_document-form.html"); 
$div = $dom->createElement("div"); 
$form = $dom->getElementsByTagName("form")->item(0); 
$form->appendChild($div); 
echo $dom->saveHTML(); 

應該直接附加到它們從DOM中取出的對象,並首先加載文檔。
爲了幫助您最初的問題太多:

  • 追加直接到你拉,因爲它引用的對象元素。
  • new DOMDocument可用於創建多個文檔。
  • 使用DOMDocument::createElement之前loadHTMLFile創建2 DOMDocuments
  • 使用DomDocument::createDocumentFragment的行爲相同,並創建它自己的DOM。

如果你想保持你的代碼相同,並創建兩個DomDocuments那麼你應該使用DomDocument::importNode,這方面的一個例子是:

$dom = new DOMDocument(); 
$div = $dom->createElement("div"); 
$dom->loadHTMLFile("assets/dom_document-form.html"); 
$node = $dom->importNode($div); 
$form = $dom->getElementsByTagName("form")->item(0); 
$form->appendChild($node); 
echo $dom->saveHTML();