【PHP8.x】Dom\EntityReference::parentNodeプロパティの使い方
parentNodeプロパティの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
『parentNodeプロパティは、現在のエンティティ参照ノードの親ノードを保持するプロパティです。XMLやHTMLドキュメントは、要素などが入れ子になった階層的なツリー構造で構成されています。このプロパティは、特定のエンティティ参照ノード(例えば & のような特殊文字を表すノード)が、ツリー構造の中でどのノードの直下に配置されているか、つまり直接の親にあたるノードを取得するために使用されます。このプロパティは読み取り専用であり、parentNodeに値を代入して親子関係を直接変更することはできません。ノードの親子関係を変更するには、appendChildメソッドなどを使用する必要があります。もしノードに親が存在しない場合、例えば、新しく作成されただけでまだドキュメントに追加されていないノードなどの場合は、このプロパティの値はnullになります。したがって、このプロパティが返す値は親ノードを表すDom\Nodeオブジェクト、または親が存在しないことを示すnullのいずれかです。これにより、特定のノードがドキュメント内のどこに位置しているかをプログラムで正確に把握することが可能になります。
構文(syntax)
1<?php 2 3$dom = new \DOMDocument(); 4$element = $dom->createElement('parent'); 5$entityRef = $dom->createEntityReference('example'); 6 7$element->appendChild($entityRef); 8$dom->appendChild($element); 9 10$parentNodeOfEntityRef = $entityRef->parentNode; 11 12echo $parentNodeOfEntityRef->nodeName; 13 14?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
Dom\Node|null
このプロパティは、現在のDOMノードの親ノードを表すDom\Nodeオブジェクト、または親ノードが存在しない場合にはnullを返します。
サンプルコード
PHP DOM parentNode で親ノードを取得する
1<?php 2 3declare(strict_types=1); 4 5/** 6 * Dom\EntityReference の parentNode プロパティを使用して親ノードを取得する例を示します。 7 * 8 * XMLドキュメント内のエンティティ参照ノードを見つけ、 9 * その親ノードがどの要素であるかを出力します。 10 */ 11function getEntityReferenceParentNode(): void 12{ 13 // DTDでエンティティを定義したXML文字列を準備します。 14 // ここでは `©` がエンティティ参照です。 15 $xmlString = <<<XML 16<?xml version="1.0" encoding="UTF-8"?> 17<!DOCTYPE root [ 18 <!ENTITY copy "Copyright"> 19]> 20<document> 21 <paragraph>This is a © notice.</paragraph> 22</document> 23XML; 24 25 // DOMDocumentオブジェクトをインスタンス化します。 26 $dom = new DOMDocument(); 27 28 // エンティティ参照をそのままノードとして維持するために、 29 // `substituteEntities` オプションを false に設定します。 30 // これを true (デフォルト) にすると、`©` は "Copyright" というテキストに置き換えられてしまいます。 31 $dom->substituteEntities = false; 32 33 // XML文字列を読み込みます。 34 $dom->loadXML($xmlString); 35 36 // <paragraph>要素を取得します。 37 $paragraph = $dom->getElementsByTagName('paragraph')->item(0); 38 39 // <paragraph>要素の子ノードをループで調べ、エンティティ参照ノードを探します。 40 foreach ($paragraph->childNodes as $child) { 41 // ノードが DOMEntityReference のインスタンスであるかを確認します。 42 // これは "©" のようなノードに該当します。 43 if ($child instanceof DOMEntityReference) { 44 echo "エンティティ参照ノード (&{$child->nodeName};) を見つけました。\n"; 45 46 // parentNode プロパティにアクセスして親ノードを取得します。 47 $parentNode = $child->parentNode; 48 49 // 親ノードが存在することを確認し、そのノード名(タグ名)を出力します。 50 if ($parentNode !== null) { 51 // 期待される出力: 親ノードのタグ名は 'paragraph' です。 52 echo "親ノードのタグ名は '{$parentNode->nodeName}' です。\n"; 53 } 54 // 目的のノードを見つけたのでループを終了します。 55 break; 56 } 57 } 58} 59 60// 関数を実行します。 61getEntityReferenceParentNode();
Dom\EntityReferenceクラスのparentNodeプロパティは、XMLドキュメント内のエンティティ参照ノード(例: ©)の直接の親ノードを取得するために使用されます。このプロパティは読み取り専用で、引数は必要ありません。戻り値として、親ノードを表すDom\Nodeオブジェクトを返します。もし親ノードが存在しない場合はnullが返されます。
サンプルコードでは、まずDTD(文書型定義)でエンティティ©を定義したXMLを読み込みます。ここで重要なのは、$dom->substituteEntities = false;と設定している点です。これにより、©はテキストに置換されず、エンティティ参照ノードとして扱われます。次に、コードは<paragraph>要素の子ノードを順に調べ、©に対応するエンティティ参照ノードを見つけます。そして、そのノードのparentNodeプロパティにアクセスすることで親ノード(この場合は<paragraph>要素)を取得し、そのタグ名であるparagraphを出力しています。このように、parentNodeプロパティを使うことで、特定のエンティティがどの要素の中に配置されているかを簡単に確認できます。
エンティティ参照をノードとして扱うには、XMLを読み込む前にDOMDocumentのsubstituteEntitiesプロパティをfalseに設定することが重要です。デフォルトのtrueのままだとエンティティ参照がテキストに置換され、DOMEntityReferenceオブジェクトを取得できません。parentNodeプロパティは、親ノードが存在しない場合はnullを返すため、利用する前に必ずnullチェックを行う必要があります。また、要素の子ノードにはテキストなども含まれるため、foreachループ内でinstanceofを用いてノードの種類を判定することで、より安全で正確な処理を実装できます。