【PHP8.x】parentNodeプロパティの使い方
parentNodeプロパティの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
parentNodeプロパティは、DOMCharacterDataオブジェクトの親ノードを保持するプロパティです。DOMCharacterDataは、テキストデータを持つノード(例えば、テキストノードやコメントノード)を表現するために使用されます。parentNodeプロパティは、そのテキストデータを持つノードが、DOMツリー内のどのノードに属しているかを示すものです。
具体的には、parentNodeプロパティは、親ノードを表すDOMNodeオブジェクト、または親ノードが存在しない場合はnullを返します。例えば、テキストノードがDOM要素の子として存在する場合、parentNodeプロパティはそのDOM要素を指します。もしテキストノードがルートノードである場合、またはまだどのノードにも追加されていない場合は、parentNodeプロパティはnullになります。
このプロパティは、DOMツリーを辿る際に非常に役立ちます。DOMツリーを操作し、特定のノードの親ノードにアクセスしたい場合に、このプロパティを使用することで、DOMツリー構造におけるノード間の関係性を把握し、目的の操作を実行できます。DOMCharacterDataオブジェクトのparentNodeプロパティを使用することで、テキストノードやコメントノードが属するコンテキストを理解し、適切な処理を行うことが可能になります。DOM操作におけるノード間の親子関係を理解する上で重要な役割を果たします。
構文(syntax)
1<?php 2$dom = new DOMDocument(); 3$dom->loadXML('<root><foo>bar</foo></root>'); 4$element = $dom->getElementsByTagName('foo')->item(0); 5$parentNode = $element->parentNode; 6 7echo $parentNode->tagName; 8?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
DOMNode|null
DOMCharacterData オブジェクトを操作しているノードの親ノードを表す DOMNode オブジェクト、または親ノードが存在しない場合は null を返します。
サンプルコード
PHP DOM parentNodeで親ノードを取得する
1<?php 2 3declare(strict_types=1); 4 5/** 6 * DOMCharacterDataのparentNodeプロパティの使用例を示します。 7 * 8 * この関数は、HTMLドキュメント内の特定のテキストノード(DOMText)を取得し、 9 * その親ノード(DOMElement)の情報を出力します。 10 * DOMTextはDOMCharacterDataクラスを継承しているため、この例は 11 * DOMCharacterData::$parentNode の動作を実証します。 12 */ 13function demonstrateDomParentNode(): void 14{ 15 // 操作対象となるHTML文字列 16 $html = <<<HTML 17 <!DOCTYPE html> 18 <html lang="ja"> 19 <head> 20 <title>DOM parentNode Example</title> 21 </head> 22 <body> 23 <div id="container"> 24 <p>ここにテキストがあります。</p> 25 <!-- これはコメントノードです --> 26 </div> 27 </body> 28 </html> 29 HTML; 30 31 // DOMDocumentオブジェクトを生成 32 $dom = new DOMDocument(); 33 34 // HTMLを安全に読み込む(HTML5のタグに対応するためエラー出力を抑制) 35 libxml_use_internal_errors(true); 36 $dom->loadHTML($html); 37 libxml_clear_errors(); 38 39 // <p>タグの要素を取得 40 $pElement = $dom->getElementsByTagName('p')->item(0); 41 42 // <p>要素内の最初のノード(この場合はテキストノード)を取得 43 // DOMTextはDOMCharacterDataのサブクラスです 44 $textNode = $pElement->firstChild; 45 46 // テキストノードが取得できた場合 47 if ($textNode instanceof DOMCharacterData) { 48 // parentNodeプロパティを使って親ノードを取得 49 $parentNode = $textNode->parentNode; 50 51 // 親ノードが存在すれば、そのタグ名を出力 52 // この場合の親ノードは <p> 要素 53 if ($parentNode instanceof DOMNode) { 54 echo "テキストノード「" . trim($textNode->nodeValue) . "」の親ノードは <" . $parentNode->nodeName . "> です。" . PHP_EOL; 55 } 56 } 57} 58 59// 関数を実行して結果を表示 60demonstrateDomParentNode();
DOMCharacterDataクラスのparentNodeプロパティは、テキストノードやコメントノードといった文字データを持つノードの、直接の親ノードを取得するために使用します。
このサンプルコードでは、まずHTML文字列をDOMDocumentオブジェクトとして解析し、操作可能な階層構造(DOMツリー)を構築します。次に、getElementsByTagNameメソッドで<p>要素を取得し、その最初の子要素であるテキストノード「ここにテキストがあります。」を取得しています。このテキストノードはDOMCharacterDataクラスを継承したDOMTextオブジェクトです。
$textNode->parentNodeのようにparentNodeプロパティにアクセスすると、このテキストノードの親、すなわち<p>要素を表すDOMElementオブジェクトが返されます。parentNodeプロパティは引数を取らず、戻り値として親ノードを表すDOMNodeオブジェクト、もしくは親が存在しない場合はnullを返します。
最終的に、取得した親ノードのnodeNameプロパティ(この場合はタグ名p)を出力することで、特定のテキストがどの要素に含まれているかを確認できることを示しています。
parentNodeプロパティは、テキストやコメントなどがどの要素に含まれているか(親ノード)を知るために使います。最も重要な注意点は、このプロパティが常に親ノードを返すわけではなく、親が存在しない場合はnullを返すことです。そのため、取得した値に対してタグ名(nodeName)などを参照する前には、必ずnullでないかを確認してください。この確認を怠るとエラーの原因となります。また、サンプルコードのテキストノード(DOMText)だけでなく、コメントノード(DOMComment)なども同様にparentNodeプロパティで親ノードを取得できます。HTMLの階層構造を意識することが正しく扱うための鍵です。