Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【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で厳密な比較を行うようにしましょう。このようにnodeValuetextContentは似た機能を提供しますが、空ノードに対する挙動が異なるため、状況に応じて使い分けることが重要です。

nodeValuetextContentは要素ノードからテキストを取得する際に似た結果を返しますが、挙動が少し異なります。nodeValueは空の要素ノードの場合、nullを返す可能性があります。そのため、?string型として扱います。一方、textContentは空文字列を返します。

要素ノード以外(例えば属性ノード)では、nodeValueは属性値を返しますが、textContentは定義されていません。サンプルコードでは要素ノードでの比較に限定されています。nodeValueはノードの種類によって意味が異なる点に注意してください。loadXMLでXML文字列を読み込む際、XMLの形式が正しくないとエラーが発生する可能性があります。エラー処理を追加することを推奨します。

関連コンテンツ

関連プログラミング言語