Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】Dom\Document::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 DomDocument importNode でノードをコピーする

1<?php
2
3/**
4 * Dom\Document::importNode メソッドの使用例を示します。
5 * このメソッドは、別の Dom\Document インスタンスからノードをコピーし、
6 * 現在の Dom\Document にインポートするために使用されます。
7 */
8function demonstrateImportNode(): void
9{
10    // --- 1. インポート元の Dom\Document を準備 ---
11    // コピーしたいノードを含むドキュメントを作成します。
12    $sourceDocument = new Dom\Document();
13    $sourceDocument->loadXML('<data><item id="A">最初のアイテム</item><item id="B">二番目のアイテム</item></data>');
14
15    // インポートしたいノードを選択します。
16    // ここでは、最初の <item> 要素(id="A")を選択します。
17    $nodeToImport = $sourceDocument->getElementsByTagName('item')->item(0);
18
19    // 選択したノードが存在しない場合はエラーメッセージを表示して終了します。
20    if (!$nodeToImport) {
21        echo "インポート元のノードが見つかりませんでした。\n";
22        return;
23    }
24
25    echo "--- インポート元のノードの内容 ---\n";
26    echo $sourceDocument->saveXML($nodeToImport) . "\n\n";
27
28    // --- 2. インポート先の Dom\Document を準備 ---
29    // コピーしたノードを受け入れるドキュメントを作成します。
30    $targetDocument = new Dom\Document();
31    // インポートしたノードを追加するためのルート要素を用意します。
32    $targetDocument->loadXML('<result></result>');
33
34    // --- 3. ノードをインポートし、ターゲットドキュメントに追加 ---
35    // Dom\Document::importNode メソッドでノードをコピー(インポート)します。
36    // - 第1引数: コピーしたい Dom\Node オブジェクト ($nodeToImport)。
37    // - 第2引数: $deep (bool) - true にすると、ノードとそのすべての子孫ノードがコピーされます(ディープコピー)。
38    //                             false の場合、ノード自身のみがコピーされ、子ノードはコピーされません。
39    $importedNode = $targetDocument->importNode($nodeToImport, true);
40
41    // インポートされたノードを、ターゲットドキュメントのルート要素 (<result>) の子として追加します。
42    $targetDocument->documentElement->appendChild($importedNode);
43
44    // --- 4. 結果の表示 ---
45    echo "--- インポート後のターゲットドキュメント全体のXML ---\n";
46    // XMLを見やすく整形するため formatOutput を true に設定します。
47    $targetDocument->formatOutput = true;
48    echo $targetDocument->saveXML();
49}
50
51// 上記の関数を実行して、Dom\Document::importNode の動作を確認します。
52demonstrateImportNode();

Dom\Document::importNode メソッドは、XMLドキュメントの操作で利用されるPHPの機能です。このメソッドは、あるDom\Documentインスタンスから別のDom\Documentインスタンスへ、特定のノード(要素やテキストなど)をコピーしてインポートするために使用されます。

サンプルコードでは、まずインポート元のドキュメントとしてXMLデータから<item id="A">最初のアイテム</item>というノードを選択しています。次に、インポート先の空のドキュメントを用意し、このメソッドを呼び出します。

importNodeメソッドの第1引数には、コピーしたいDom\Nodeオブジェクト(ここでは選択した<item>ノード)を指定します。第2引数$deepは真偽値で、trueを設定すると、指定したノードだけでなく、そのノードの子孫すべて(内部の要素やテキストなど)も一緒にコピーされます。falseの場合はノード自身のみがコピーされ、子孫はコピーされません。この例ではtrueが指定されているため、<item>要素とその内部のテキスト「最初のアイテム」が丸ごとコピーされます。

メソッドはコピーされた新しいDom\Nodeオブジェクトを返します。この戻り値は、インポート先のドキュメントに属するノードなので、その後appendChildなどのメソッドを使って、インポート先のドキュメントの適切な位置に追加することができます。最終的に、ターゲットドキュメントにはインポートされたノードが追加され、その内容を確認できます。

Dom\Document::importNodeは、別のDOMドキュメントに存在するノードを現在のドキュメントで利用するために「コピー」するメソッドです。元のドキュメントのノードはそのまま残ります。コピーされたノードは、このメソッドの戻り値として取得され、その後appendChildなどを使って、ターゲットドキュメント内の適切な場所に「追加」する必要があります。特に注意すべきは第2引数$deepで、trueにするとノードとそのすべての子孫がコピーされますが、falseだとノード自身のみがコピーされます。意図した構造をコピーするため、この引数の設定を必ず確認してください。

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の利用が適切です。

関連コンテンツ

関連プログラミング言語