LINUX.ORG.RU

Работа с PHP DOM - как в XML заменить один тег на другой, сохраняя подчиненные элементы?

 , , ,


0

3

Имеется текст с XML-форматированием:

<div id="recordContent">
    <div style="font-style:normal;">
        <p>Text 1</p>
        <p>Text 2</p>
    </div>
</div>

Необходимо в нем заменить тег <div id=«recordContent»> на <body>, вот так:
<body>
    <div style="font-style:normal;">
        <p>Text 1</p>
        <p>Text 2</p>
    </div>
</body>

Для этого я написал следующий минимальный код:
<?php

$contents = <<<STR
<div id="recordContent">
    <div style="font-style:normal;">
        <p>Text 1</p>
        <p>Text 2</p>
    </div>
</div>
STR;

$htmlDom = new DOMDocument();
$htmlDom->loadHTML($contents);

// Поиск элемента с внутренними узлами
$element = $htmlDom->getElementById("recordContent");

if ($element) 
{
    // Создание нового элемента <body>
    $htmlBody = $htmlDom->createElement('body');

    // Копирование дочерних элементов из <div> в <body>
    foreach ($element->childNodes as $child) 
    {
        $htmlBody->appendChild($child);
    }

    // Замена элемента <div> верхнего уровня
    $element->parentNode->replaceChild($htmlBody, $element);

    // Получаем HTML-код внутри элемента
    $innerHtml = $htmlDom->saveXML();

    echo $innerHtml;
}    

?>

И этот PHP-код генерит вот такой текст:
<?xml version="1.0" standalone="yes"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><body>
    </body></body></html>

Вопрос: что не так, почему вместо замены одного головного элемента происходит не то что ожидается?

★★★★★

Последнее исправление: Xintrea (всего исправлений: 2)

<?php

$contents = <<<STR
<div id="recordContent">
    <div style="font-style:normal;">
        <p>Text 1</p>
        <p>Text 2</p>
    </div>
</div>
STR;

$htmlDom = new DOMDocument();
$htmlDom->loadHTML($contents);
$element = $htmlDom->getElementById("recordContent");

if ($element) {
    $body = $element->parentNode;
    foreach ($element->childNodes as $child)
    	if ($child->nodeType == 1)
        	$body->appendChild($child);
    $body->removechild($element);
    echo $htmlDom->saveHTML($body);
}    

?>
anonymous
()