ノードを複製する
ノードの複製とは、同じ型の新しいノードを作成し、(必要なら)現在のノードと同じコンテンツに設定することを意味します。ノードを複製するにはcloneNodeメソッドを使います。
DOMNode DOMNode::cloneNode([ bool $deep])
現在のノードの複製を作成します。引数$deepは、現在のノードの子もコピーするかどうかを指定するものです。デフォルト値はFALSE(コピーしない)です。例えば、次のコードは要素<author>を複製し、元の要素<author>の子として付加します。図4に結果を示します。
//Set the reference node
$author = $root->getElementsByTagName('author')->item(0);
//Call the cloningNode function
cloningNode($author);
//This function clone the $currentNode
function cloningNode($currentNode)
{
$clonenode = $currentNode -> cloneNode(true);
$newnode = $currentNode->appendChild($clonenode);
}

子ノードを削除する
ノードをDOMツリーから削除するにはremoveChildメソッドを使います。
DOMNode DOMNode::removeChild(DOMNode $oldnode)
この関数は子ノードを削除します。引数$oldnodeは削除する子ノードです。例えば、次のコードは子ノード<bibliography>をBooks.xml文書から削除します。結果(図5)を見ると、bibliographyノードがなくなっていることが分かります。
//Get a reference to the bibliography node
$bibliography = $root->getElementsByTagName(
'bibliography')->item(0);
//Call the removingChild function
removingChild($bibliography);
//This function remove the $currentNode node
function removingChild($currentNode)
{
$oldbibliography = $root->removeChild($currentNode);
}
ノードを置換する
既存のノードを新しいノードに置き換えるには、replaceChildメソッドを使います。
DOMNode DOMNode::replaceChild(DOMNode $newnode, DOMNode $oldnode)
この関数は新しいノードがまだ別の親の子でなければ、$oldnodeを新しい子ノード$newnodeに置き換えます。
例えば、子ノードISBNを新しい子ノードcodeに置き換えるには次のようにします。
//Get the ISBN node
$element = $dom->getElementsByTagName('ISBN')->item(0);
//Create the new <code> element
$code = $dom->createElement('code', '909090');
//Call the replacingNode function
replacingNode($code,$element);
//This function replaces $currentNode with $node
function replacingNode($currentNode, $node)
{
$node->parentNode->replaceChild($currentNode, $node);
}
結果(図6)を見ると、ノードが置き換えられていることが分かります。

ノードをインポートする
現在のツリーに別のツリーからノードをコピーするにはimportNodeメソッドを使います。
DOMNode DOMDocument::importNode(DOMNode $importedNode [,bool $deep])
この関数は新しいノードがまだ別の親の子でなければ、$oldnodeを新しい子ノード$newnodeに置き換えます。このメソッドはノードを別のXML文書からインポートし、現在の文書のDOMツリーに挿入します。引数$importedNodeはインポートするノードです。インポートされるノードは元のノードの''コピー''なので、インポートによって外部のツリーが変更されることはありません。引数$deepはインポートするノードをディープコピーするかどうかを指示するものです。TRUEのときは、ノードの部分ツリー全体がインポートされ、FALSEのときは、直接のノードだけがインポートされます。
例として、ノード<continue>をBook_continue.xmlファイルからBook.xmlにインポートすることを考えます。Book_continue.xml文書の内容は次のとおりです。
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!--chapter V-->
<continue>
<chapter_V>
<title>XPath</title>
<content>XPath is language for...</content>
</chapter_V>
<![CDATA[
This chaper is a bonus to...
]]>
<printing cap_I="click_here_for_chapter_I"
cap_II="click_here_for_chapter_II"
cap_III="click_here_for_chapter_III"
cap_IV="click_here_for_chapter_IV"
cap_V="click_here_for_chapter_V" />
</continue>
ノード<continue>をインポートするコードは次のようになります。
<?php
$olddoc = new DOMDocument;
$olddoc->load("Book_continue.xml");
// The node we want to import to a new document
$node = $olddoc->getElementsByTagName("continue")->item(0);
$newdoc = new DOMDocument;
$newdoc->formatOutput = true;
$newdoc->load("Book.xml");
// Import the node, and all its children, to the document
$node = $newdoc->importNode($node, true);
// And then append it to the root node
$newdoc->documentElement->appendChild($node);
echo "\nThe 'new document' after copying the nodes into it:\n";
$root = $newdoc->firstChild;
function getNodesInfo($node)
{
if ($node->hasChildNodes())
{
$subNodes = $node->childNodes;
foreach ($subNodes as $subNode)
{
if (($subNode->nodeType != 3) ||
(($subNode->nodeType ==3) &&
(strlen(trim($subNode->wholeText))>=1)))
{
echo "Node name: ".$subNode->nodeName."\n";
echo "Node value: ".$subNode->nodeValue."\n";
}
getNodesInfo($subNode);
}
}
}
getNodesInfo($root);
?>
図7に結果を示します。


