使用DOM进行XML重组

时间:2011-04-13 06:41:06

标签: 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(); 

我遇到的问题是频道元素加倍。 请帮忙。

2 个答案:

答案 0 :(得分:3)

我认为这不应该太难:我认为你使用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();

答案 1 :(得分:0)

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

See it