【PHP8.x】DOMDocument::nodeValueプロパティの使い方
nodeValueプロパティの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
nodeValueプロパティは、DOMツリー内の各ノードが保持するテキストコンテンツを保持するプロパティです。このプロパティは、ノードの種類によって取得できる値が異なります。
特にDOMDocumentクラスのインスタンス、つまりドキュメント全体を表すノードに対してnodeValueプロパティを参照した場合、通常はnullを保持します。これは、DOMDocumentオブジェクト自体が、直接的なテキストデータを持つノードではないためです。DOMDocumentはHTMLやXMLドキュメント全体の構造を管理する役割を持ち、その内部に要素やテキストといった具体的な内容を含んでいます。
このプロパティは、主にテキストノード、コメントノード、CDATAセクションノードといった、実際に文字情報を保持するノードで具体的な値を示します。これらのノードでは、nodeValueプロパティを通じてノードが持つテキストの内容を取得したり、新しいテキストに更新したりすることができます。
システムエンジニアを目指す方にとって、nodeValueプロパティがノードの種類によって振る舞いが異なることを理解することは、DOM操作を正確に行う上で非常に重要です。
構文(syntax)
1<?php 2$dom = new DOMDocument(); 3echo $dom->nodeValue; 4?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
?string
DOMDocument オブジェクトが表すノードのテキストコンテンツを文字列として返します。ノードがテキストコンテンツを持たない場合や、ノードがテキストコンテンツを持てない型の場合は null を返します。
サンプルコード
PHP DOMDocument nodeValue と textContent の違い
1<?php 2 3// DOMDocument を使用して XML ドキュメントを操作する例 4$xmlString = <<<XML 5<root> 6 <element attribute="value">This is the text content.</element> 7 <element2>Another text node</element2> 8</root> 9XML; 10 11$dom = new DOMDocument(); 12$dom->loadXML($xmlString); 13 14$element = $dom->documentElement->firstChild; // 最初の要素ノードを取得 15 16// nodeValue を使用してノードの値を読み取る (要素ノードの場合、すべての子テキストノードを連結したものが返る) 17$nodeValue = $element->nodeValue; 18echo "nodeValue: " . $nodeValue . PHP_EOL; // 出力: nodeValue: This is the text content. 19 20// textContent プロパティを使用しても同様の結果を得られる 21$textContent = $element->textContent; 22echo "textContent: " . $textContent . PHP_EOL; // 出力: textContent: This is the text content. 23 24// 空のノードを作成 25$emptyElement = $dom->createElement("emptyElement"); 26$dom->documentElement->appendChild($emptyElement); 27 28// nodeValue は null を返す場合があるため、null許容型で扱う 29$emptyNodeValue = $emptyElement->nodeValue; 30if ($emptyNodeValue === null) { 31 echo "emptyNodeValue is null" . PHP_EOL; // 出力: emptyNodeValue is null 32} 33 34// textContent は空文字列を返す 35$emptyTextContent = $emptyElement->textContent; 36echo "emptyTextContent is empty: " . ($emptyTextContent === "") . PHP_EOL; // 出力: emptyTextContent is empty: 1
DOMDocumentクラスのnodeValueプロパティは、ノードの値を文字列として取得するために使用します。このプロパティは、PHP 8で利用可能です。引数はなく、戻り値はnullable string (?string)型です。
サンプルコードでは、XML文字列をDOMDocumentオブジェクトに読み込み、最初の要素ノードを取得しています。nodeValueプロパティにアクセスすることで、要素ノードに含まれるすべての子テキストノードを連結した文字列を取得できます。textContentプロパティも同様にノードのテキストコンテンツを取得できます。
重要な違いとして、空の要素ノードに対してnodeValueを呼び出した場合、nullが返ることがあります。そのため、戻り値はnullable string型として定義されています。一方、textContentプロパティは空文字列("")を返します。
nodeValueを使用する際は、nullが返る可能性を考慮し、=== nullで厳密な比較を行うようにしましょう。このようにnodeValueとtextContentは似た機能を提供しますが、空ノードに対する挙動が異なるため、状況に応じて使い分けることが重要です。
nodeValueとtextContentは要素ノードからテキストを取得する際に似た結果を返しますが、挙動が少し異なります。nodeValueは空の要素ノードの場合、nullを返す可能性があります。そのため、?string型として扱います。一方、textContentは空文字列を返します。
要素ノード以外(例えば属性ノード)では、nodeValueは属性値を返しますが、textContentは定義されていません。サンプルコードでは要素ノードでの比較に限定されています。nodeValueはノードの種類によって意味が異なる点に注意してください。loadXMLでXML文字列を読み込む際、XMLの形式が正しくないとエラーが発生する可能性があります。エラー処理を追加することを推奨します。