【PHP8.x】Dom\ProcessingInstruction::parentNodeプロパティの使い方
parentNodeプロパティの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
parentNodeプロパティは、現在の処理命令ノード(Dom\ProcessingInstruction)の親ノードを保持するプロパティです。XMLやHTMLドキュメントは、要素が入れ子になった階層的なツリー構造で構成されています。この構造において、parentNodeは、あるノードを直接含んでいる一つ上の階層のノードを指します。このプロパティを参照することで、特定の処理命令がドキュメント内のどの要素に属しているか、あるいはドキュメント直下に配置されているかといった親子関係を確認できます。返される値は、親となるDom\Nodeオブジェクト、多くの場合Dom\ElementやDom\Documentですが、親が存在しない場合はnullとなります。例えば、新しく作成されたばかりでまだドキュメントに追加されていないノードのparentNodeはnullです。このプロパティは読み取り専用であり、直接値を代入してノードの場所を変更することはできません。ノードの移動や親子関係の変更には、appendChild()やinsertBefore()などのDOM操作メソッドを使用する必要があります。
構文(syntax)
1<?php 2 3$xml_string = <<<XML 4<book> 5 <?xml-stylesheet type="text/css" href="style.css"?> 6 <title>PHP for Beginners</title> 7</book> 8XML; 9 10$doc = new Dom\Document(); 11$doc->loadXML($xml_string); 12 13// 処理命令ノードを取得します (この例では <book> の最初の子ノード) 14$pi_node = $doc->documentElement->firstChild; 15 16// parentNode プロパティにアクセスして親ノードを取得します 17$parent = $pi_node->parentNode; 18 19// 親ノードのノード名を出力します 20// この場合の親は <book> 要素です 21echo $parent->nodeName; // "book" 22
引数(parameters)
引数なし
引数はありません
戻り値(return)
Dom\Node|null
このプロパティは、この処理命令ノードが属する親ノードを返します。親ノードが存在しない場合は null が返されます。
サンプルコード
PHP DOM: ProcessingInstruction の parentNode を取得する
1<?php 2 3declare(strict_types=1); 4 5/** 6 * このスクリプトは、XML内の処理命令ノード(Processing Instruction)を取得し、 7 * その親ノードを `parentNode` プロパティを使って見つける方法を示します。 8 */ 9 10// 1. DOMDocumentオブジェクトをインスタンス化します。 11$dom = new DOMDocument(); 12 13// 2. 処理命令 `<?xml-stylesheet ... ?>` を含むXML文字列を定義します。 14$xmlString = <<<XML 15<?xml version="1.0" encoding="UTF-8"?> 16<?xml-stylesheet type="text/css" href="style.css"?> 17<root> 18 <item>コンテンツ</item> 19</root> 20XML; 21 22// XML文字列を読み込み、DOMツリーを構築します。 23$dom->loadXML($xmlString); 24 25// 3. 処理命令ノード (`Dom\ProcessingInstruction`) を取得します。 26// ドキュメント直下の子ノードをループして、目的のノードタイプを探します。 27$processingInstructionNode = null; 28foreach ($dom->childNodes as $node) { 29 // ノードが処理命令であるかを確認します。 30 if ($node instanceof DOMProcessingInstruction) { 31 $processingInstructionNode = $node; 32 break; 33 } 34} 35 36// 4. 処理命令ノードが見つかった場合、その親ノードにアクセスします。 37if ($processingInstructionNode) { 38 echo "処理命令が見つかりました: " . $processingInstructionNode->target . PHP_EOL; 39 40 // `parentNode` プロパティを使用して親ノードを取得します。 41 // この例では、処理命令はXMLドキュメントの最上位にあるため、 42 // 親ノードはドキュメントノード全体になります。 43 $parentNode = $processingInstructionNode->parentNode; 44 45 if ($parentNode) { 46 // 親ノードのノード名を出力します。ドキュメントノードの場合、'#document' となります。 47 echo "親ノードのノード名: " . $parentNode->nodeName . PHP_EOL; 48 // 親ノードのクラス名(型)を出力します。 49 echo "親ノードの型: " . get_class($parentNode) . PHP_EOL; 50 } else { 51 echo "親ノードが見つかりませんでした。" . PHP_EOL; 52 } 53} else { 54 echo "処理命令ノードが見つかりませんでした。" . PHP_EOL; 55} 56 57?>
Dom\ProcessingInstructionクラスのparentNodeプロパティは、XML文書内にある処理命令ノードの親ノードを取得するために使用されます。このプロパティにアクセスすることで、XMLの階層構造において、現在の処理命令ノードがどのノードの直下に配置されているかを知ることができます。
このプロパティは引数を取らず、アクセスするだけで値を取得できます。戻り値として、親ノードを表すDom\Nodeオブジェクトが返されます。親ノードが存在しない場合、例えばノードがまだドキュメントツリーに追加されていない状態などではnullが返ります。
サンプルコードでは、まずXML文字列を読み込み、その中から<?xml-stylesheet ... ?>という処理命令ノードを探しています。次に見つけた処理命令ノードのparentNodeプロパティを使い、その親ノードを取得しています。この例では、処理命令がXML文書の最上位に直接配置されているため、親ノードは文書全体を表現するDom\Documentオブジェクト(ノード名は#document)となります。このようにparentNodeプロパティを利用することで、特定のノードの文書内での位置関係を把握し、階層を遡るような操作が可能になります。
parentNodeプロパティは、常に親ノードを返すとは限りません。戻り値がDom\Node|nullと示されている通り、親が存在しない場合はnullを返します。そのため、プロパティの値を利用する前には、必ずif文などでnullでないことを確認する処理が不可欠です。また、親ノードの種類は、処理命令がXML文書のどこにあるかで変わります。サンプルコードのように文書の最上位にあれば、親は文書全体を指すDOMDocumentオブジェクトとなり、そのノード名は仕様上#documentと表示されます。もし特定の要素内にあれば、その要素(DOMElement)が親ノードになります。