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

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

作成日: 更新日:

基本的な使い方

importNodeメソッドは、他のXMLドキュメントに属するノードを、現在のDom\XMLDocumentインスタンスにインポートして、このドキュメントの一部として扱えるようにするメソッドです。このメソッドを利用することで、異なるドキュメントからXMLの要素や属性、テキストなどのノードを取り込み、現在のドキュメント内で操作したり追加したりすることが可能になります。

第一引数には、インポートしたいDOMノードオブジェクトを渡します。第二引数 $deep はオプションで、真偽値 (true または false) を指定します。true を指定すると、対象ノードだけでなく、そのノードの子ノードもすべて再帰的にインポートされます。false または省略した場合、対象ノード自身のみがインポートされ、子ノードは含まれません。

このメソッドは、新しくインポートされ、現在のドキュメントに属するようになったノードオブジェクトを返します。もしインポート処理が失敗した場合は false が返されます。元のドキュメントからノードが移動するのではなく、元のノードはそのまま残り、そのコピーが現在のドキュメント用に作成される点が重要です。複数のXMLデータを組み合わせて一つのドキュメントを構築するような場面で、この機能は大変有用です。

構文(syntax)

1$importedNode = $targetDocument->importNode($sourceNode, $deep);

引数(parameters)

DOMNode $node, bool $deep = false

  • DOMNode $node: インポートするDOMNodeオブジェクト
  • bool $deep = false: trueを指定すると、指定した$nodeの子要素もすべて再帰的にインポートします。falseの場合、$nodeのみをインポートします。

戻り値(return)

Dom\Node

指定されたXMLノードを、現在のXMLドキュメントにインポートした新しいノードを返します。

サンプルコード

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

1<?php
2
3// XML ドキュメントを新規に作成します。
4$dom = new DomDocument('1.0', 'UTF-8');
5
6// ルート要素を作成します。
7$root = $dom->createElement('root');
8$dom->appendChild($root);
9
10// インポートするノードを持つ別のXMLドキュメントを作成します。
11$domImport = new DomDocument('1.0', 'UTF-8');
12$domImport->loadXML('<item id="1"><name>Example</name></item>');
13
14// インポートするノードを取得します。
15$nodeToImport = $domImport->documentElement;
16
17// ノードをインポートします。deep = true は子ノードもコピーします。
18$importedNode = $dom->importNode($nodeToImport, true);
19
20// インポートされたノードを新しいドキュメントに追加します。
21$root->appendChild($importedNode);
22
23// 結果を表示します。
24echo $dom->saveXML();

このサンプルコードは、PHPのDomDocumentクラスのimportNodeメソッドの使い方を示しています。importNodeメソッドは、別のXMLドキュメントからノードを現在のドキュメントにコピーするために使用されます。

まず、新しいXMLドキュメント ($dom) を作成し、ルート要素を追加します。次に、インポート元のXMLドキュメント ($domImport) を作成し、loadXMLメソッドでXML文字列を読み込みます。

$domImport->documentElementでインポートしたいノード(この例では<item>要素)を取得し、$dom->importNode($nodeToImport, true) を実行します。importNodeメソッドは、第一引数にインポートするノード、第二引数にdeepフラグを受け取ります。deepフラグがtrueの場合、指定されたノードだけでなく、そのすべての子ノードもコピーされます。falseの場合は、ノード自身のみがコピーされます。

importNodeメソッドは、インポートされたノードの新しいインスタンスを返します。この例では、$importedNodeにそのインスタンスが格納されます。最後に、$root->appendChild($importedNode)で、インポートされたノードを新しいドキュメントのルート要素の子要素として追加します。

$dom->saveXML()で、作成されたXMLドキュメントを文字列として出力し、結果を確認できます。このコードを実行すると、元のドキュメントにインポートされたノードが追加されたXMLが出力されます。このメソッドを使うことで、異なるXMLドキュメント間でノードを安全にコピーし、操作することが可能になります。

DomDocument::importNodeメソッドは、異なるXMLドキュメント間でノードをコピーする際に使用します。第一引数にはインポート元のノードを指定し、第二引数$deepは、ノードの子要素もまとめてコピーするかどうかを決定します。$deep = trueを指定すると、子要素も再帰的にコピーされます。

注意点として、インポートされたノードは元のドキュメントとは異なるノードオブジェクトとして扱われるため、元のノードを変更してもインポートされたノードには影響しません。また、importNodeはノードをコピーするだけで、ドキュメントに追加するわけではないため、appendChildなどのメソッドを使って明示的にドキュメントに追加する必要があります。インポート元のノードが存在しない場合や、不正な形式のノードをインポートしようとするとエラーが発生する可能性があります。