【PHP8.x】DOMProcessingInstruction::parentNodeプロパティの使い方
parentNodeプロパティの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
『parentNodeプロパティは…を保持するプロパティです』
parentNodeプロパティは、現在の処理命令ノード(DOMProcessingInstruction)の親ノードを保持するプロパティです。DOM(Document Object Model)では、XMLやHTML文書はツリーのような階層構造で表現されます。この構造において、あるノードが直接含まれている一つ上の階層のノードを「親ノード」と呼びます。このプロパティにアクセスすると、親にあたるDOMNodeオブジェクトが返されます。これにより、特定の処理命令が文書内のどの要素の子として存在するのか、あるいはドキュメントの直下に配置されているのかをプログラムで把握できます。もし、対象のノードがまだドキュメントツリーに追加されておらず、どのノードの子でもない孤立した状態の場合、このプロパティはnullを返します。parentNodeプロパティは読み取り専用であり、直接値を代入して親子関係を変更することはできません。ノードを別の場所に移動させる場合は、DOMNodeクラスが提供するappendChildやinsertBeforeといったメソッドを使用する必要があります。このプロパティは、DOMツリー内でのノードの位置関係を特定し、構造を辿る上で重要な役割を果たします。
構文(syntax)
1<?php 2 3// 処理命令を含むXML文字列を定義 4$xmlString = '<?xml version="1.0"?><book><title>Title</title><?php target data ?></book>'; 5 6// DOMDocumentオブジェクトを作成し、XMLを読み込む 7$doc = new DOMDocument(); 8$doc->loadXML($xmlString); 9 10// 処理命令ノード(DOMProcessingInstruction)を取得する 11// この例では、<book>要素の最後の子ノード 12$piNode = $doc->documentElement->lastChild; 13 14// parentNodeプロパティを使って親ノード(<book>要素)を取得する 15$parentNode = $piNode->parentNode; 16 17// 親ノードのタグ名を出力して確認する 18echo $parentNode->tagName; 19 20?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
DOMNode|null
この parentNode プロパティは、この DOMProcessingInstruction オブジェクトが属する親ノード、または親ノードが存在しない場合は null を返します。
サンプルコード
PHP DOM parentNodeで親ノードを取得する
1<?php 2 3/** 4 * DOMProcessingInstruction の parentNode プロパティの使用例を示します。 5 * 6 * XMLドキュメント内の処理命令ノードを取得し、 7 * その親ノードがドキュメント自身であることを確認します。 8 */ 9function demonstrateDomProcessingInstructionParentNode(): void 10{ 11 // 処理命令 (<?php ... ?>) を含むXML文字列を定義 12 $xmlString = <<<XML 13<?xml version="1.0" encoding="UTF-8"?> 14<?php phpinfo(); ?> 15<root> 16 <item>Hello World</item> 17</root> 18XML; 19 20 // DOMDocumentオブジェクトを生成し、XML文字列を読み込む 21 $document = new DOMDocument(); 22 $document->loadXML($xmlString); 23 24 // ドキュメント直下の子ノードをすべて取得し、処理命令ノードを探す 25 $processingInstructionNode = null; 26 foreach ($document->childNodes as $node) { 27 // ノードの種類が処理命令 (Processing Instruction) かどうかを判定 28 if ($node->nodeType === XML_PI_NODE) { 29 $processingInstructionNode = $node; 30 break; // 最初に見つかった処理命令ノードを使用する 31 } 32 } 33 34 // 処理命令ノードが見つかった場合のみ実行 35 if ($processingInstructionNode instanceof DOMProcessingInstruction) { 36 echo "発見した処理命令ノードのターゲット: " . $processingInstructionNode->target . PHP_EOL; 37 echo "発見した処理命令ノードのデータ: " . $processingInstructionNode->data . PHP_EOL; 38 echo PHP_EOL; 39 40 // parentNode プロパティにアクセスして親ノードを取得 41 // この例では、処理命令はドキュメントの直下にあるため、親は DOMDocument オブジェクト自身 42 $parentNode = $processingInstructionNode->parentNode; 43 44 if ($parentNode !== null) { 45 echo "親ノードのノード名: " . $parentNode->nodeName . PHP_EOL; 46 // 親ノードがDOMDocumentのインスタンスであることを確認 47 if ($parentNode instanceof DOMDocument) { 48 echo "親ノードは DOMDocument オブジェクトです。" . PHP_EOL; 49 } 50 } else { 51 echo "親ノードが見つかりませんでした。" . PHP_EOL; 52 } 53 } else { 54 echo "処理命令ノードが見つかりませんでした。" . PHP_EOL; 55 } 56} 57 58// 関数を実行して結果を表示 59demonstrateDomProcessingInstructionParentNode(); 60
DOMProcessingInstructionクラスのparentNodeプロパティは、XML文書内にある処理命令ノードの親ノードを取得するために使用します。このプロパティに引数はなく、戻り値として親ノードを表すDOMNodeオブジェクト、または親ノードが存在しない場合にはnullを返します。
サンプルコードでは、まず<?php phpinfo(); ?>という処理命令を含むXML文字列をDOMDocumentオブジェクトとして読み込んでいます。次に、ドキュメント内の子ノードを順番に調べ、目的の処理命令ノード (DOMProcessingInstructionオブジェクト) を探し出します。
そして、$processingInstructionNode->parentNodeのようにparentNodeプロパティにアクセスすることで、その処理命令ノードが属している親ノードを取得しています。この例では、処理命令ノードはXML文書の最上位に直接記述されているため、その親ノードは文書全体を表すDOMDocumentオブジェクト自身となります。このように、parentNodeプロパティを使うことで、特定のノードが文書構造のどこに位置しているかを確認できます。
parentNodeプロパティは、処理命令がどのノードに属しているか(親ノード)を示しますが、親がいない場合はnullを返します。そのため、このプロパティの値を利用する前には、必ずnullでないことを確認する習慣をつけましょう。もし確認を怠ると、nullに対して操作しようとしてエラーが発生する原因になります。また、親ノードの種類はXMLの構造によって異なり、ドキュメント自身(DOMDocument)の場合もあれば、特定の要素(DOMElement)の場合もあります。instanceof演算子を使って親ノードの型を正しく判定することで、より安全で確実なコードになります。