Исключить исключение «DOMException» с сообщением «Ошибка запроса иерархии»

Я получаю ошибку при замене или добавлении дочернего элемента в узел.

Требуется:

Я хочу изменить это на ..

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

как это

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

ошибка

Неустранимая ошибка: исключить исключение «DOMException» с сообщением «Ошибка запроса иерархии»

мой код

 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); } } 

Ошибка запроса иерархии ошибок с помощью DOMDocument в PHP означает, что вы пытаетесь переместить узел в себя. Сравните это со змеей на следующем рисунке:

Змея ест себя

Подобно этому с вашим узлом. Вы перемещаете узел в себя. Это означает, что в тот момент, когда вы хотите заменить человека абзацем, этот человек уже является детьми этого абзаца.

Метод appendChild () эффективно уже перемещает человека из дерева DOM, он больше не является частью:

 $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> 

Ева уже ушла. Его parentNode уже является абзацем.

Итак, вместо этого вы сначала хотите заменить, а затем добавить дочерний элемент:

 $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> 

Теперь все в порядке.