【PHP8.x】DOMEntityReference::firstChildプロパティの使い方
firstChildプロパティの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
firstChildプロパティは、DOMEntityReferenceオブジェクトが表すエンティティ参照の、最初の子ノードを保持するプロパティです。DOM(Document Object Model)では、ドキュメントはノードと呼ばれるオブジェクトのツリー構造で管理されます。DOMEntityReferenceノードは、&example;のようなエンティティ参照を表し、このエンティティが展開されると、その内部にテキストや要素などの子ノードを持つことがあります。このプロパティは、それらの子ノードの中で一番最初に現れるノードをDOMNodeオブジェクトとして返します。もし対象のエンティティ参照に子ノードが一つも存在しない場合には、このプロパティの値はnullになります。したがって、このプロパティを利用する際は、値がnullでないことを確認してから操作を行うことが推奨されます。このプロパティは読み取り専用であり、直接値を代入して子ノードを変更することはできません。子ノードの操作にはappendChild()のような専用のメソッドを使用する必要があります。
構文(syntax)
1<?php 2 3$xml = <<<XML 4<?xml version="1.0"?> 5<!DOCTYPE doc [ 6 <!ENTITY my_entity "Text inside the entity"> 7]> 8<doc>&my_entity;</doc> 9XML; 10 11$dom = new DOMDocument(); 12$dom->loadXML($xml); 13 14// &my_entity; を表す DOMEntityReference オブジェクトを取得します 15$entityRef = $dom->documentElement->firstChild; 16 17// firstChild プロパティで、エンティティ参照の最初の子ノードを取得します 18$childNode = $entityRef->firstChild; 19 20echo $childNode->nodeValue; 21 22?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
?DOMNode
DOMEntityReference要素の最初の子ノードをDOMNodeオブジェクトとして返します。子ノードが存在しない場合はnullを返します。
サンプルコード
PHP DOMEntityReference::firstChild で子ノードを取得する
1<?php 2 3/** 4 * DOMEntityReference::firstChild の使用例を示すための関数 5 * 6 * XMLドキュメント内に定義されたエンティティ参照を取得し、 7 * その最初の子ノード情報を出力します。 8 */ 9function demonstrateDomEntityReferenceFirstChild(): void 10{ 11 // DTD (文書型定義) を使ってエンティティを定義したXML文字列。 12 // エンティティ '&details;' は '<strong>重要</strong>な情報' という内容を表します。 13 $xmlString = <<<XML 14<?xml version="1.0" encoding="UTF-8"?> 15<!DOCTYPE root [ 16 <!ENTITY details "<strong>重要</strong>な情報"> 17]> 18<root> 19 <p>&details;</p> 20</root> 21XML; 22 23 // DOMDocument オブジェクトを初期化します 24 $doc = new DOMDocument(); 25 26 // XML文字列を読み込みます。 27 // デフォルトのオプションでは、エンティティ参照 '&details;' は 28 // DOMEntityReference オードとしてドキュメントツリーに配置されます。 29 $doc->loadXML($xmlString); 30 31 // <p> タグの要素を取得します 32 $paragraph = $doc->getElementsByTagName('p')->item(0); 33 34 // <p> 要素の最初の子ノード (この場合は &details; エンティティ参照ノード) を取得します 35 $entityReferenceNode = $paragraph->firstChild; 36 37 // 取得したノードが DOMEntityReference のインスタンスであるかを確認します 38 if ($entityReferenceNode instanceof DOMEntityReference) { 39 echo "エンティティ参照ノードが見つかりました: " . $entityReferenceNode->nodeName . PHP_EOL; 40 41 // firstChild プロパティを使って、エンティティ参照の最初の子ノードを取得します。 42 // この例では、エンティティの内容 '<strong>重要</strong>な情報' の 43 // 先頭にある <strong> 要素 (DOMElement) が返されます。 44 // 子ノードが存在しない場合は null が返ります。 45 $firstChild = $entityReferenceNode->firstChild; 46 47 if ($firstChild) { 48 echo "firstChild のノード名: " . $firstChild->nodeName . PHP_EOL; // "strong" 49 echo "firstChild のテキスト内容: " . $firstChild->textContent . PHP_EOL; // "重要" 50 echo "firstChild の型: " . get_class($firstChild) . PHP_EOL; // "DOMElement" 51 } else { 52 echo "エンティティ参照に子ノードはありません。" . PHP_EOL; 53 } 54 } else { 55 echo "エンティティ参照ノードが見つかりませんでした。" . PHP_EOL; 56 } 57} 58 59// 関数を実行して結果を表示します 60demonstrateDomEntityReferenceFirstChild();
このPHPサンプルコードは、XML文書内にあるエンティティ参照ノードの、最初の子ノードを取得するDOMEntityReference::firstChildプロパティの使用例です。
まず、DTD(文書型定義)を使って&details;というエンティティを定義したXML文字列をDOMDocumentオブジェクトに読み込みます。このとき、<p>要素の子として&details;を表すDOMEntityReferenceノードが作成されます。
firstChildプロパティは、このDOMEntityReferenceノードが内部に保持しているコンテンツの、先頭にあるノードを取得します。このプロパティに引数は必要ありません。今回の例では、&details;の内容は「<strong>重要</strong>な情報」というHTMLフラグメントです。そのため、$entityReferenceNode->firstChildを実行すると、先頭にある<strong>要素がDOMElementオブジェクトとして返されます。
戻り値は最初の子ノードを表すDOMNodeオブジェクト、もしくは子ノードが存在しない場合はnullとなります。そのため、サンプルコードのようにif文でnullでないことを確認してからプロパティにアクセスするのが安全な使い方です。このようにして、エンティティ参照の具体的な構造をプログラムで解析できます。
DOMEntityReferenceのfirstChildプロパティは、エンティティ参照の中身として定義されたXML構造の、最初のノードを取得します。このサンプルコードのようにエンティティが<strong>タグで始まる場合、その<strong>要素(DOMElement)が返されます。注意点として、DOMDocument::loadXML()のオプションにLIBXML_NOENTを指定すると、エンティティ参照は自動的に展開されてしまいDOMEntityReferenceノードが生成されないため、このプロパティは使えません。また、エンティティの中身が空などの理由で子ノードを持たない場合、firstChildはnullを返します。そのため、取得した値のプロパティやメソッドにアクセスする前には、必ずnullでないことを確認するチェック処理が必要です。