【PHP8.x】Dom\EntityReference::firstChildプロパティの使い方
firstChildプロパティの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
firstChildプロパティは、エンティティ参照ノードの最初の子ノードを保持するプロパティです。XMLやHTML文書において、エンティティ参照は &name; のような形式で記述され、定義済みのテキストやマークアップに展開されます。このプロパティは、その展開された内容が持つノード構造のうち、先頭に位置する子ノードを取得するために使用されます。返される値は、要素やテキストなど、あらゆる種類の子ノードを表す Dom\Node オブジェクトまたはその派生クラスのインスタンスです。もし、対象となるエンティティ参照ノードに子ノードが一つも存在しない場合には、このプロパティは null を返します。このプロパティは読み取り専用のため、直接値を代入してノード構造を変更することはできません。子ノードの追加や変更を行う場合は、appendChildなどのDOM操作メソッドを利用する必要があります。
構文(syntax)
1<?php 2 3$xml = <<<XML 4<!DOCTYPE doc [ 5 <!ENTITY myEntity "entity-text"> 6]> 7<doc>&myEntity;</doc> 8XML; 9 10$doc = new Dom\Document(); 11$doc->loadXML($xml); 12 13// <doc>要素の子ノードであるエンティティ参照ノードを取得 14$entityRef = $doc->documentElement->childNodes->item(0); 15 16// $entityRef (Dom\EntityReference) の firstChild プロパティにアクセス 17// これにより、エンティティ参照が展開された後の最初のノード(テキストノード)が取得される 18$firstChildNode = $entityRef->firstChild; 19 20// 結果(テキストノードの値)を出力 21echo $firstChildNode->nodeValue; // "entity-text" 22 23?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
?Dom\Node
このプロパティは、指定された要素の最初の子ノードを返します。子ノードが存在しない場合は、nullを返します。
サンプルコード
PHP DOMEntityReference firstChild を取得する
1<?php 2 3declare(strict_types=1); 4 5/** 6 * Dom\EntityReferenceのfirstChildプロパティの使用例を示します。 7 * 8 * XMLドキュメント内のエンティティ参照(&author;)を取得し、 9 * その最初の子ノード(この場合はテキストノード)の内容を出力します。 10 */ 11function displayEntityReferenceFirstChild(): void 12{ 13 // DTD(文書型定義)で内部エンティティ 'author' を定義したXML文字列 14 $xmlString = <<<XML 15 <?xml version="1.0" encoding="UTF-8"?> 16 <!DOCTYPE book [ 17 <!ENTITY author "Taro Yamada"> 18 ]> 19 <book> 20 <author>&author;</author> 21 </book> 22 XML; 23 24 // DOMDocumentオブジェクトを作成 25 $dom = new \DOMDocument(); 26 27 // XML文字列を読み込みます。 28 // PHPのデフォルト設定ではエンティティ参照はノードとして保持されます。 29 // ($dom->substituteEntities を true にすると、エンティティがテキストに置き換えられ 30 // Dom\EntityReferenceノードが生成されなくなるため注意が必要です) 31 $dom->loadXML($xmlString); 32 33 // XPathを使って <author> 要素を取得 34 $xpath = new \DOMXPath($dom); 35 $authorElement = $xpath->query('//author')->item(0); 36 37 // <author>要素の最初の子ノードであるエンティティ参照ノード (&author;) を取得 38 $entityRefNode = $authorElement->firstChild; 39 40 // 取得したノードが Dom\EntityReference のインスタンスであるかを確認 41 if ($entityRefNode instanceof \Dom\EntityReference) { 42 echo "エンティティ参照ノード (&{$entityRefNode->nodeName};) を取得しました。" . PHP_EOL; 43 44 // firstChildプロパティでエンティティ参照の最初の子ノードを取得します。 45 // エンティティ'author'はテキスト "Taro Yamada" を持つため、 46 // そのテキストを表す Dom\Text ノードが返されます。 47 $firstChildOfEntity = $entityRefNode->firstChild; 48 49 if ($firstChildOfEntity !== null) { 50 // 子ノードの型と内容を出力します。 51 echo "firstChildの型: " . $firstChildOfEntity::class . PHP_EOL; 52 echo "firstChildの内容 (nodeValue): " . $firstChildOfEntity->nodeValue . PHP_EOL; 53 } else { 54 echo "このエンティティ参照に子ノードはありません。" . PHP_EOL; 55 } 56 } else { 57 echo "エンティティ参照ノードが見つかりませんでした。" . PHP_EOL; 58 } 59} 60 61// 関数を実行 62displayEntityReferenceFirstChild(); 63
このPHPサンプルコードは、XMLドキュメント内に定義されたエンティティ参照(Dom\EntityReference)が持つ、最初の子ノードを取得する方法を解説します。
Dom\EntityReferenceクラスのfirstChildは、特定のエンティティ参照ノードの最初の子ノードを取得するためのプロパティです。このプロパティは引数を取らず、戻り値として子ノードを表すDom\Nodeオブジェクトを返します。もし子ノードが存在しない場合はnullを返します。
サンプルコードでは、まずDTD(文書型定義)で&author;というエンティティ(実体は文字列 "Taro Yamada")を定義したXMLを読み込みます。次に、<author>要素の最初の子ノードであるエンティティ参照ノード&author;を取得します。
続いて、このエンティティ参照ノードに対してfirstChildプロパティを使用します。&author;の実体は "Taro Yamada" というテキストであるため、firstChildプロパティはそのテキストを表すDom\Textノードを返します。最後に、取得したテキストノードのクラス名と、nodeValueプロパティを使ってその内容である "Taro Yamada" を画面に出力しています。このように、エンティティ参照が持つ具体的な内容の先頭要素へアクセスできます。
このコードはXMLのエンティティ参照が持つ最初の子ノードを取得します。注意点として、DOMDocumentのsubstituteEntitiesプロパティがfalse(デフォルト)でないと、エンティティ参照は単なるテキストに置き換えられ、Dom\EntityReferenceノードが生成されないため、このコードは期待通りに動作しません。また、firstChildプロパティは子ノードが存在しない場合にnullを返す可能性があるため、取得した値を使用する前に必ずnullチェックを行う必要があります。このチェックを怠るとエラーの原因となります。エンティティ参照ノードの子がテキストノードになる、という階層構造を理解することも大切です。