【PHP8.x】importNodeメソッドの使い方

importNodeメソッドの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

importNodeメソッドは、PHPのDOM拡張機能において、あるDOMドキュメントに属するノードを、別のDom\Documentインスタンスにコピーして利用できるように実行するメソッドです。このメソッドは、主に異なるHTMLやXMLドキュメント間で要素、属性、テキストなどのノードを移動または複製する際に利用されます。

具体的には、引数として指定されたノードを、このメソッドが呼び出されたDom\Documentオブジェクトの所有物として再作成します。インポートされたノードは、現在のドキュメントのコンテキストで操作可能になりますが、ドキュメントツリーには自動的に追加されません。そのため、インポート後にはappendChildinsertBeforeなどのメソッドを用いて、インポートしたノードをドキュメント内の適切な位置に手動で挿入する必要があります。

このメソッドの重要な機能として、ノードとその子孫ノードをすべてインポートするかどうかを制御する $deep 引数があります。trueを指定すると、元のノードとそのサブツリー(子孫ノード全て)が深くコピーされます。一方、falseを指定すると、ノード自体のみがコピーされ、子孫ノードは含まれません。この柔軟性により、必要に応じてノードの一部または全体を効果的に扱えます。

構文(syntax)

1<?php
2
3$targetDocument = new Dom\Document(); // ノードをインポートする Dom\Document インスタンス
4$nodeToImport = new Dom\Element('sample'); // インポートしたい Dom\Node インスタンス
5$deepCopy = true; // 子ノードも再帰的にインポートする場合は true、しない場合は false
6
7$importedNode = $targetDocument->importNode($nodeToImport, $deepCopy);
8
9?>

引数(parameters)

Dom\Node $node, bool $deep = false

  • Dom\Node $node: インポートするDOMノードを指定します。
  • bool $deep = false: trueを指定すると、指定したノードの子孫ノードもすべて再帰的にインポートします。デフォルトはfalseで、指定したノードのみをインポートします。

戻り値(return)

Dom\Node

指定されたXMLノードを現在のDOMドキュメントにインポートしたDom\Nodeオブジェクトを返します。

サンプルコード

PHP DOM importNode でノードをインポートする

1<?php
2
3// ターゲットとなる新しいDOMドキュメントを作成します。
4$targetDocument = new Dom\Document();
5// 出力時にXMLが整形されるように設定し、見やすくします。
6$targetDocument->formatOutput = true;
7
8// ターゲットドキュメントのルート要素を作成し、ドキュメントに追加します。
9$targetRoot = $targetDocument->createElement('targetDocumentRoot');
10$targetDocument->appendChild($targetRoot);
11
12// インポート元となるDOMドキュメントを作成し、XML文字列を読み込みます。
13$sourceDocument = new Dom\Document();
14$sourceDocument->loadXML('<sourceData><item id="uniqueId">データ内容</item></sourceData>');
15
16// インポート元のドキュメントから、インポートしたいDom\Node(ここでは<item>要素)を取得します。
17$nodeToImport = $sourceDocument->getElementsByTagName('item')->item(0);
18
19// Dom\Document::importNode メソッドを使用して、ノードをターゲットドキュメントにインポートします。
20// 第二引数 $deep を true に設定すると、ノードの子孫(この場合は「データ内容」というテキスト)も一緒にインポートされます。
21$importedNode = $targetDocument->importNode($nodeToImport, true);
22
23// インポートしたノードを、ターゲットドキュメント内の適切な場所(ここではターゲットのルート要素の子)に追加します。
24$targetRoot->appendChild($importedNode);
25
26// 最終的なターゲットドキュメントのXML内容を出力して、インポートが成功したことを確認します。
27echo "--- 最終的なターゲットドキュメントの内容 ---\n";
28echo $targetDocument->saveXML();
29
30?>

PHP 8のDom\Document::importNodeメソッドは、異なるXMLドキュメント(Dom\Documentオブジェクト)間でノードをコピーする際に使用します。これにより、あるドキュメントに存在する要素やテキストなどを、別のドキュメントに持ち込むことができます。

このメソッドは2つの引数を取ります。最初の$node引数には、インポートしたい元のドキュメントに存在するDom\Nodeオブジェクトを指定します。例えば、別のXMLファイルから読み込んだドキュメント内の特定要素などが該当します。二番目の$deep引数はブール値で、trueを設定すると指定したノードの子孫(子要素や含まれるテキストデータなど)も一緒にインポートされます。falseの場合は、ノード自体のみがインポートされ、その中身は含まれません。

importNodeメソッドは、インポート先のドキュメントに属する新しいDom\Nodeオブジェクトを返します。この戻り値のノードはまだドキュメントのツリー構造に追加されていないため、実際に追加するにはappendChildなどのメソッドを別途使用する必要があります。

サンプルコードでは、sourceDocumentから<item>要素を取得し、targetDocumentへインポートしています。$deeptrueにすることで、<item>要素とその中の「データ内容」というテキストもコピーされ、最終的にtargetDocumentのルート要素の子として追加されています。これにより、二つのドキュメントの内容が統合されたXMLが生成されます。

Dom\Document::importNodeは、あるDOMドキュメントから別のドキュメントへノードをコピーする際に使用します。このメソッドはノードを元のドキュメントから移動させるのではなく、新しいコピーを作成する点に注意が必要です。コピーしたノードは、その後、appendChildなどのメソッドでターゲットドキュメントの適切な位置に明示的に追加しなければドキュメントツリーには含まれません。また、第二引数$deepをtrueに設定するとノードの子孫もまとめてインポートされますが、falseの場合は親ノードのみがインポートされ、子要素は含まれません。意図しない結果にならないよう、目的の子要素が必要か確認してください。同じドキュメント内でノードを複製したい場合は、importNodeではなくcloneNodeの利用が適切です。

関連コンテンツ

関連プログラミング言語