How to use DOMDocument insertBefore

appendchild, createelement, domdocument, php

Solution

It's because you're not specifying a reference node that the inserted node should be inserted before. Think of it like this:

$whatTheElementIsInsertedInto->insertBefore($theElement, $whatItIsInsertedBefore)

Live demo (click).

$dom = new DOMDocument();

$dom->loadHtml('
  <html><head></head>
    <body>
      <div id="content">
        <h3>Original h3</h3>
      </div>
    </body>
  </html>
');

//find the "content" div
$content = $dom->getElementById('content');

//find the first h3 tag in "content"
$origH3 = $content->getElementsByTagName('h3')->item(0);

//create a new h3
$newH3 = $dom->createElement('h3', 'new h3!');

//insert the new h3 before the original h3 of "content"
$content->insertBefore($newH3, $origH3);

echo $dom->saveHTML();

Problem

I have a div and I'm trying to insert a couple elements (h3 and p) into the div ahead of the existing h3 and p elements already living inside the div. The PHP documentation for insertBefore (http://www.php.net/manual/en/domnode.insertbefore.php) says this is exactly what should happen, but instead of inserting ahead of the existing elements, its replacing all existing elements inside my 'content' div. Here's my code: ``` $webpage = new DOMDocument(); $webpage->loadHTMLFile("news.html"); $headerelement = $webpage->createElement('h3', $posttitle); $pelement = $webpage->createElement('p', $bodytext); $webpage->formatOutput = true; $webpage->getElementById('content')->insertBefore($headerelement); $webpage->getElementById('content')->insertBefore($pelement); $webpage->saveHTMLFile("newpost.html"); ``` I'm sure I'm just not understanding something... any help would be appreciated, thanks.

Original source