Uncaught exception 'DOMException' with message 'Hierarchy Request Error'

11,557

The error Hierarchy Request Error with DOMDocument in PHP means that you are trying to move a node into itself. Compare this with the snake in the following picture:

Snake eats itself

Similar this is with your node. You move the node into itself. That means, the moment you want to replace the person with the paragraph, the person is already a children of the paragraph.

The appendChild() method effectively already moves the person out of the DOM tree, it is not part any longer:

$para = $doc->createElement("p");
$para->setAttribute('attr', 'value');
$para->appendChild($person);

<?xml version="1.0"?>
<contacts>
  <person>Adam</person>

  <person>John</person>
  <person>Thomas</person>
</contacts>

Eva is already gone. Its parentNode is the paragraph already.

So Instead you first want to replace and then append the child:

$para = $doc->createElement("p");
$para->setAttribute('attr', 'value');
$person = $person->parentNode->replaceChild($para, $person);
$para->appendChild($person);

<?xml version="1.0"?>
<contacts>
  <person>Adam</person>
  <p attr="value"><person>Eva</person></p>
  <person>John</person>
  <person>Thomas</person>
</contacts>

Now everything is fine.

Share:
11,557
Chandan Pasunoori
Author by

Chandan Pasunoori

Updated on June 05, 2022

Comments

  • Chandan Pasunoori
    Chandan Pasunoori about 2 years

    I'm getting error while replacing or adding a child into a node.

    Required is :

    I want to change this to..

    <?xml version="1.0"?>
    <contacts>
      <person>Adam</person>
      <person>Eva</person>
      <person>John</person>
      <person>Thomas</person>
    </contacts>
    

    like this

    <?xml version="1.0"?>
    <contacts>
      <person>Adam</person>
      <p>
          <person>Eva</person>
      </p>
      <person>John</person>
      <person>Thomas</person>
    </contacts>
    

    error is

    Fatal error: Uncaught exception 'DOMException' with message 'Hierarchy Request Error'

    my code is

    function changeTagName($changeble) {
        for ($index = 0; $index < count($changeble); $index++) {
            $new = $xmlDoc->createElement("p");
            $new ->setAttribute("channel", "wp.com");
            $new ->appendChild($changeble[$index]);
            $old = $changeble[$index];
            $result = $old->parentNode->replaceChild($new , $old);
        }
    }
    
  • Chandan Pasunoori
    Chandan Pasunoori about 11 years
    this works exactly what I want.. And very very thanks for good explanation.. Thank you