开发者

php domdocument exception loadHTMLFile

开发者 https://www.devze.com 2023-03-12 02:00 出处:网络
I am having a strange behavior in my script. That has me confused Script 1. $dom = new DOMDocument(); $dom->loadHTMLFile(\"html/signinform.html\");//loads file here

I am having a strange behavior in my script. That has me confused

Script 1.

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

Script 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();

Script 1 works without problem. It shows the form. However Script 2 throws the following error: Fatal error: Uncaught exception 'DOMException' with message 'Wrong Document Error' in C:\Users

Could someone explain to me why the mere changing of position of the loadHTMLFile function results in such error? Thanks


You have added an element to the DOM (div) and then attempted to load a file to be parsed and its DOM structure used.

Load the file first if you intend to use one.


For DOM manipulation you do not need to insert an already existing element so doing something like this: $dom->appendChild($form) only reinserts the same form element, when you pull an element using $dom->getElementsByTag("form")->item(0) it becomes it's own DOM object which you can reference directly and append to. A proper example would be:

$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();

One should append directly to the object they pulled from the DOM instead and load the document first.
To help aid your initial questions too:

  • Append directly to element that you pulled as it references the object.
  • new DOMDocument can be used to create multiple documents.
  • using DOMDocument::createElement before loadHTMLFile creates 2 DOMDocuments.
  • Using DomDocument::createDocumentFragment acts the same and creates it's own DOM.

If you would like to keep your code the same and create two DomDocuments then you should use DomDocument::importNode, an example of this would be:

$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();
0

精彩评论

暂无评论...
验证码 换一张
取 消