【PHP8.x】DOMEntityReference::nodeValueプロパティの使い方
nodeValueプロパティの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
nodeValueプロパティは、ノードの値を保持するプロパティです。このプロパティはDOMNodeクラスから継承されており、その挙動はノードの種類によって異なります。DOMEntityReferenceクラスのインスタンス、すなわちXMLやHTMLドキュメント内のエンティティ参照ノード(例: &example;)の場合、このnodeValueプロパティは常にnullを返します。これは、エンティティ参照ノード自体が具体的な値を持つのではなく、あらかじめ定義されたエンティティへの参照を示す役割を担っているためです。エンティティが実際に表す内容、例えば特定のテキストや他のノード群を取得したい場合は、このエンティティ参照ノードの子ノードにアクセスする必要があります。childNodesプロパティなどを通じて子ノード群を取得し、その中のテキストノードなどのnodeValueを調べることで、展開されたコンテンツを得ることができます。したがって、DOMEntityReferenceオブジェクトに対して直接nodeValueを参照しても値は得られず、また値を設定しようとしてもその操作は無視されます。
構文(syntax)
1<?php 2$xml = <<<XML 3<?xml version="1.0" encoding="UTF-8"?> 4<!DOCTYPE doc [ 5<!ENTITY company "My Company"> 6]> 7<doc> 8 <author>&company;</author> 9</doc> 10XML; 11 12$dom = new DOMDocument(); 13$dom->loadXML($xml); 14 15// <author> タグの子ノードである DOMEntityReference オブジェクトを取得 16$entityRefNode = $dom->getElementsByTagName('author')->item(0)->childNodes->item(0); 17 18// DOMEntityReference::$nodeValue プロパティにアクセスします。 19// このプロパティの値は常に null です。 20$value = $entityRefNode->nodeValue; 21 22var_dump($value); // NULL 23?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
string|null
DOMエンティティ参照ノードのテキスト値、またはノードがテキスト値を持たない場合はnullを返します。
サンプルコード
PHP: nodeValue vs textContent 比較
1<?php 2 3declare(strict_types=1); 4 5/** 6 * DOMNodeの nodeValue と textContent プロパティの違いを比較します。 7 * 8 * `nodeValue` は、主にテキストノードやコメントノード自身の値を取得するために使用します。 9 * 要素ノードに対して使用すると `null` を返します。 10 * 11 * `textContent` は、要素ノードとそのすべての子孫ノードに含まれるテキストを 12 * 連結した文字列を取得します。HTMLタグは除去されます。 13 */ 14function compareNodeValueAndTextContent(): void 15{ 16 // 比較用のHTMLコンテンツ 17 $html = <<<HTML 18 <div id="container"> 19 Hello <strong>World</strong>! <!-- This is a comment --> 20 </div> 21 HTML; 22 23 // DOMDocumentオブジェクトを作成し、HTMLを読み込む 24 $dom = new DOMDocument(); 25 $dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); 26 27 // id="container" の div 要素を取得 28 $element = $dom->getElementById('container'); 29 30 if ($element === null) { 31 echo 'Element not found.' . PHP_EOL; 32 return; 33 } 34 35 // --- 要素ノード (div) に対する比較 --- 36 37 // nodeValue: 要素ノード自体はテキスト値を持たないため、null を返します。 38 echo 'Element nodeValue: '; 39 var_dump($element->nodeValue); // 出力: NULL 40 41 // textContent: 子要素のタグを除いた、すべてのテキストコンテンツを連結して返します。 42 // 前後の空白や改行も含まれる点に注意してください。 43 echo 'Element textContent: '; 44 var_dump(trim($element->textContent)); // 出力: string(12) "Hello World!" 45 46 47 // --- テキストノード ("Hello ") に対する比較 --- 48 $textNode = $element->firstChild; // div要素の最初の子ノード("Hello "というテキストノード) 49 50 if ($textNode instanceof DOMText) { 51 // nodeValue: テキストノード自身の値を返します。 52 echo 'Text nodeValue: '; 53 var_dump($textNode->nodeValue); // 出力: string(6) "Hello " 54 55 // textContent: テキストノードの場合、nodeValue と同じ値を返します。 56 echo 'Text textContent: '; 57 var_dump($textNode->textContent); // 出力: string(6) "Hello " 58 } 59} 60 61// 関数を実行 62compareNodeValueAndTextContent();
nodeValueは、DOMの特定のノードが持つ自身の値を直接取得するためのプロパティです。引数はなく、ノードの種類に応じて文字列またはnullを返します。
このプロパティの挙動は、よく似たtextContentプロパティと比較することでより明確に理解できます。サンプルコードでは、HTMLのdiv要素、すなわち「要素ノード」に対してnodeValueを使用するとnullが返されます。これは、要素ノード自体は直接的なテキスト値を持たないためです。一方、textContentは、そのdiv要素の内部にあるすべての子孫ノードからテキスト部分だけを連結した「Hello World!」という文字列を返します。
次に、div要素の子である「Hello 」という「テキストノード」で両者を比較すると、nodeValueとtextContentはどちらも同じ「Hello 」という文字列を返します。
このように、nodeValueはテキストノードやコメントノードなど、ノード自身の値を取得する場合に限定して使用します。対してtextContentは、ある要素とそのすべての子孫に含まれるテキストをまとめて取得したい場合に利用するという明確な違いがあります。
nodeValueとtextContentは取得できる値が異なるため、目的に応じた使い分けが必要です。nodeValueはテキストやコメントといった、ノード自身の値を取得するためのプロパティです。<div>のような要素ノードはテキストとしての値を持たないため、nodeValueで値を取得しようとするとnullが返るので注意しましょう。一方、textContentは指定した要素とその子孫に含まれるテキストを、HTMLタグなどを除いて全て連結して返します。要素内の表示テキストをまとめて取得したい場合に便利です。textContentには意図しない空白が含まれることがあるため、trim()関数などで整形するとより安全に扱えます。