Преобразование XML с помощью DOM

#php #xml #dom

#php #xml #dom

Вопрос:

Я пытаюсь переформатировать XML, добавив узел промежуточного уровня.

Вот что у меня есть в качестве входных данных:

<channel>
<item>
<title>Advanced PHP Book</title>
</item>
<item>
<title>MySQL primer</title>
</item>
<item>
<title>C for beginners</title>
</item>
</channel>

Мне нужно, чтобы это было так в конце (узел страницы добавлен между каналом и элементом):


<channel>
<page>
<item>
<title>Advanced PHP Book</title>
</item>
<item>
<title>MySQL primer</title>
</item>
<item>
<title>C for beginners</title>
</item>
</page>
</channel>

Вот мой тестовый код:

 
$sxe = simplexml_load_string($string);

$dom_sxe = dom_import_simplexml($sxe);

$dom = new DOMDocument('1.0');

$channel = $dom->appendChild($dom->createElement('channel'));

$page = $channel->appendChild($dom->createElement('page'));

$dom_sxe = $dom->importNode($dom_sxe, true);
$dom_sxe = $page->appendChild($dom_sxe);

$dom->formatOutput = true;

echo $dom->saveXML(); 
  

Проблема, с которой я сталкиваюсь, заключается в том, что элемент channel удваивается.
Пожалуйста, помогите.

Ответ №1:

Я не думаю, что это должно быть слишком сложно: я думаю, вы слишком усложняете это, используя simplexml материал.

 $dom = new DOMDocument;
$dom->loadXML($string);

// create the <page> element
$page = $dom->createElement('page');

while ($dom->firstChild->firstChild) {
    // move the items in <channel> to the <page> element
    $page->appendChild($dom->firstChild->firstChild);
}

// insert the <page> element into <channel>
$dom->firstChild->appendChild($page);
$dom->saveXML();
  

Ответ №2:

 $xml = '<channel> <item> <title>Advanced PHP Book</title> </item> <item> <title>MySQL primer</title> </item> <item> <title>C   for beginners</title> </item> </channel>';

$dom = new DOMDocument;
$dom->loadXML($xml);
$page = $dom->createElement('page');
$items = $dom->getElementsByTagName('item');

while ($items->length) {
    $page->appendChild($items->item(0));
}

$dom->getElementsByTagName('channel')->item(0)->appendChild($page);
echo $dom->saveXML();
  

Вывод

 <?xml version="1.0"?>
<channel>    <page><item> <title>Advanced PHP Book</title> </item><item> <title>MySQL primer</title> </item><item> <title>C   for beginners</title> </item></page></channel>
  

Посмотрите на это.

Комментарии:

1. Существует более одного item элемента.