Ваш исходный код очень близок, просто отсутствует одна ключевая точка.
Исходный код
foreach($bodyDivs[0]->childNodes as $divChild) {
$dom->getElementsByTagName('body')[0]->appendChild($divChild);
}
Попытка foreach
списка узлов, в то время кактакже удаление узлов из этого же списка (в вашем случае перемещение их в <body>
) ведет себя не так, как вы предполагали.
Упрощенный, полный пример для демонстрационных целей:
<?php
$doc = new DOMDocument;
$doc->loadXML('<example><a/><b/><c/><d/><e/></example>');
$parent = $doc->documentElement;
foreach ($parent->childNodes as $child) {
$parent->removeChild($child);
}
echo $doc->saveXML();
Это выводит следующее:
<?xml version="1.0"?>
<example><b/><c/><d/><e/></example>
Совершенно разумно, верно ?!Не бойтесь, мы можем добиться большего успеха.
Что делать?
Обычный подход, который ведет себя так, как задумано, состоит в том, чтобы перебирать список до тех пор, пока он не станет пустым..
<?php
$doc = new DOMDocument;
$doc->loadXML('<example><a/><b/><c/><d/><e/></example>');
$parent = $doc->documentElement;
while ($parent->childNodes->length > 0) {
$child = $parent->childNodes->item(0);
$parent->removeChild($child);
}
echo $doc->saveXML();
Применительно к вашему коду
Все вышеперечисленное означает, что ваш оригинал foreach
:
foreach($bodyDivs[0]->childNodes as $divChild) {
$dom->getElementsByTagName('body')[0]->appendChild($divChild);
}
может быть замененс циклом while.
while ($bodyDivs[0]->childNodes->length > 0) {
$divChild = $bodyDivs[0]->childNodes->item(0);
$dom->getElementsByTagName('body')->item(0)->appendChild($divChild);
}
В сторону: я использовал обозначение ->item(0)
выше, так как это более условно.