【PHP8.x】Dom\Text::nodeValueプロパティの使い方
nodeValueプロパティの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
nodeValueプロパティは、Dom\Textクラスに所属するプロパティであり、テキストノードのテキストコンテンツを保持するプロパティです。Dom\Textクラスは、DOM (Document Object Model) においてテキストノードを表現するために使用されます。テキストノードは、XMLやHTMLドキュメント内のテキストデータを表します。
nodeValueプロパティは、このテキストノードが保持する実際のテキストデータを文字列として取得したり、設定したりするために使用されます。例えば、HTMLドキュメント内の<p>タグ内のテキストを取得する場合、そのテキストノードのnodeValueプロパティを参照することで、テキストコンテンツを取得できます。また、テキストノードのテキストコンテンツをプログラム的に変更したい場合、nodeValueプロパティに新しい文字列を代入することで、テキストコンテンツを更新できます。
nodeValueプロパティは、DOMを操作する上で非常に重要な役割を果たします。ドキュメント内のテキストデータを読み書きする際に、このプロパティを通じてテキストノードの内容にアクセスします。このプロパティを使用することで、ドキュメントの構造を解析し、必要な情報を抽出したり、動的にコンテンツを生成したりすることが可能になります。PHPのDOM拡張機能を利用してXMLやHTMLドキュメントを扱う際、テキストノードの操作には不可欠なプロパティと言えるでしょう。
構文(syntax)
1string|null $domtext->nodeValue
引数(parameters)
引数なし
引数はありません
戻り値(return)
string|null
Dom\Text::nodeValueプロパティは、ノードのテキストコンテンツを表す文字列、またはテキストノードがない場合にnullを返します。
サンプルコード
PHP DOM nodeValue 取得・変更
1<?php 2 3/** 4 * DOMDocument を使用して HTML から Dom\Text ノードの nodeValue を取得・設定するサンプル関数。 5 * 6 * この関数は、HTML文字列を解析し、特定のテキストノードを見つけ、 7 * その nodeValue (テキスト内容) を読み取り、変更する方法を示します。 8 */ 9function demonstrateDomTextNodeValue(): void 10{ 11 // 1. DOMDocument オブジェクトを初期化します。 12 // HTMLドキュメントを解析するために使用します。 13 $dom = new DOMDocument('1.0', 'UTF-8'); 14 // HTML5のような厳密でないHTMLを解析する際に出る警告を抑制します。 15 libxml_use_internal_errors(true); 16 // 出力時のフォーマットを整える設定 (オプションですが、きれいな出力のために推奨)。 17 $dom->preserveWhiteSpace = false; 18 $dom->formatOutput = true; 19 20 // 2. 解析するHTML文字列をロードします。 21 // <p> 要素内に通常のテキストと <em> (強調) 要素が含まれています。 22 // ここでは、<p>要素の直下にあるテキストノードが主な対象になります。 23 $html = '<!DOCTYPE html><html><body><p>これは<em>元の</em>テキストです。</p></body></html>'; 24 $dom->loadHTML($html); 25 26 echo "--- 元のHTMLドキュメントの内容 ---\n"; 27 echo $dom->saveHTML() . "\n\n"; 28 29 // 3. ドキュメントから最初の <p> 要素を見つけます。 30 $pElements = $dom->getElementsByTagName('p'); 31 if ($pElements->length === 0) { 32 echo "エラー: <p>要素が見つかりませんでした。\n"; 33 return; 34 } 35 36 $p = $pElements->item(0); // コレクションから最初の <p> 要素を取得します。 37 38 echo "--- <p> 要素の子ノードを走査し、Dom\\Text ノードを探します ---\n"; 39 $textNodesProcessed = 0; 40 foreach ($p->childNodes as $childNode) { 41 // 子ノードが Dom\Text クラスのインスタンス (つまりテキストノード) であるかを確認します。 42 // PHP 8では DOMText は Dom\Text のエイリアスですが、Dom\Text を直接指定します。 43 if ($childNode instanceof Dom\Text) { 44 $textNodesProcessed++; 45 echo "発見した Dom\\Text ノードの初期 nodeValue: '{$childNode->nodeValue}'\n"; 46 47 // 4. Dom\Text::nodeValue プロパティからテキスト内容を取得します。 48 $originalNodeValue = $childNode->nodeValue; 49 echo " 取得した nodeValue: '{$originalNodeValue}'\n"; 50 51 // 5. Dom\Text::nodeValue プロパティに新しい値を設定して、テキスト内容を変更します。 52 // テキストノードの内容が直接書き換えられます。 53 $newNodeValue = '変更された部分 '; 54 $childNode->nodeValue = $newNodeValue; 55 echo " nodeValue を '{$newNodeValue}' に変更しました。\n"; 56 57 // 変更後の nodeValue を再確認します。 58 echo " 変更後の nodeValue: '{$childNode->nodeValue}'\n\n"; 59 } 60 } 61 62 if ($textNodesProcessed === 0) { 63 echo "情報: <p>要素の直下に Dom\\Text ノードが見つかりませんでした。\n"; 64 } 65 66 echo "--- nodeValue 変更後のHTMLドキュメントの内容 ---\n"; 67 echo $dom->saveHTML() . "\n"; 68} 69 70// サンプル関数を実行します。 71demonstrateDomTextNodeValue();
このサンプルコードは、PHPのDOMDocument機能を使ってHTMLドキュメント内のテキストを操作する方法を具体的に示しています。まず、与えられたHTML文字列をDOMDocumentオブジェクトに読み込み、コンピュータが構造として扱えるように準備します。
特に注目すべきは、Dom\Text::nodeValueプロパティです。これは、HTMLやXMLドキュメント内の「テキストノード」が実際に持っているテキスト内容を指します。例えば、「<p>これは<em>元の</em>テキストです。</p>」というHTMLの場合、「これは」や「テキストです。」といった部分がテキストノードになります。
このサンプルコードでは、DOMDocumentから<p>要素を見つけ出し、その子ノードを一つずつ確認していきます。もしその子ノードがDom\Textクラスのインスタンス、つまりテキストノードであれば、$childNode->nodeValueという形で、そのテキスト内容を簡単に読み取ることができます。
さらに、このnodeValueプロパティは読み取るだけでなく、新しい文字列を代入することで、テキストノードの内容をプログラム的に変更することも可能です。サンプルコードでは、元のテキストを取得した後、新しいテキストに書き換えて、その変更がHTMLドキュメント全体にどのように反映されるかを示しています。
nodeValueプロパティは引数を取りませんが、その戻り値はテキスト内容が存在すればstring型で、内容がない場合はnullとなります。このプロパティを活用することで、Webスクレイピングやコンテンツの動的な書き換えなど、HTMLやXML文書のテキストコンテンツを柔軟に操作できるようになります。PHP 8では、従来のDOMTextはDom\Textという名前で利用されます。
Dom\Text::nodeValueは、HTML要素の子要素ではなく、親要素直下の純粋なテキストノードの内容を扱います。そのため、<p>これは<em>元の</em>テキストです。</p>のような構造では、"これは"と"テキストです。"の部分がDom\Textノードとして処理され、<em>元の</em> のような要素内のテキストは直接の対象とならない点に注意が必要です。このプロパティに値を設定すると、対象のテキストノードの内容が直接上書きされます。PHP 8からはDom\Textという名前空間付きのクラスを使用しますが、以前のバージョンではDOMTextというエイリアスが使われていることも覚えておくと良いでしょう。また、nodeValueの取得結果はstringまたはnullとなるため、予期せぬエラーを防ぐためにもnullの可能性を考慮した処理を検討してください。
PHP nodeValue と textContent を比較する
1<?php 2 3// Dom\Text クラスの nodeValue プロパティと textContent プロパティの比較 4 5// XML 文字列を定義 6$xmlString = <<<XML 7<root> 8 <element> 9 This is some text. & This is more text. 10 </element> 11</root> 12XML; 13 14// DOMDocument を作成し、XML 文字列を読み込む 15$dom = new DOMDocument(); 16$dom->loadXML($xmlString); 17 18// element ノードを取得 19$element = $dom->getElementsByTagName('element')->item(0); 20 21// element ノードの最初の子ノード(テキストノード)を取得 22$textNode = $element->firstChild; 23 24// nodeValue プロパティと textContent プロパティの値を出力 25echo "nodeValue: " . $textNode->nodeValue . PHP_EOL; 26echo "textContent: " . $element->textContent . PHP_EOL; 27 28// nodeValue はテキストノード自身の値(エスケープされた文字を含む)を返す 29// textContent はノードとその子孫のテキストコンテンツを結合して返す(エスケープを解除した文字を含む) 30 31?>
PHPのDom\TextクラスにおけるnodeValueプロパティとtextContentプロパティの違いを示すサンプルコードです。nodeValueは、テキストノード自身の値を返します。一方、textContentは、ノードとその子孫ノードのテキストコンテンツを結合して返します。
このサンプルでは、まずXML文字列を定義し、DOMDocumentオブジェクトに読み込んでいます。次に、XML内の <element> タグの最初の子ノード(テキストノード)を取得します。そして、nodeValueプロパティとtextContentプロパティの値を出力しています。
nodeValueは、テキストノードに直接含まれるテキストを返し、XMLエンティティ(例: &)はエスケープされたままとなります。つまり、テキストノードが持つ、文字参照やCDATAセクションを含む生のテキストデータをそのまま取得したい場合に適しています。
対照的に、textContentは、要素ノードとそのすべての子孫ノードに含まれるテキストコンテンツを結合して返します。この際、XMLエンティティはデコードされます。このため、要素ノードの内容全体を取得したい場合に便利です。
このサンプルコードを実行することで、nodeValueとtextContentがそれぞれどのような値を返すかを確認できます。nodeValueプロパティは引数を取りませんが、string型もしくはnull型を返します。テキストノードが存在しない場合や、ノードがテキストノードでない場合は、nullを返すことがあります。
nodeValueとtextContentは似ていますが、重要な違いがあります。nodeValueは、テキストノード自身の値を返し、XMLエスケープされた文字(例:&)をそのまま含みます。一方、textContentは、要素ノードとそのすべての子孫ノードのテキストコンテンツを結合して返し、エスケープされた文字はデコードされます。サンプルコードでは、element要素の子ノード(テキストノード)に対してnodeValueを、element要素自身に対してtextContentを使用している点に注意してください。textContentは要素ノードから直接テキストを取得する場合に便利ですが、nodeValueは特定のテキストノードの値を正確に取得したい場合に適しています。どちらを使うかは、XMLの構造と、取得したいテキストの形式によって選択する必要があります。
PHP Dom\Text::nodeValue の取得と操作
1<?php 2 3/** 4 * Dom\Text::nodeValue プロパティの取得と利用例 5 * 6 * この関数は、XMLドキュメント内でテキストノードの値を操作する方法を示します。 7 * システムエンジニアを目指す初心者向けに、Dom\Text クラスの nodeValue プロパティの 8 * 基本的な使い方を簡潔に解説します。 9 * 10 * nodeValue は、主に Dom\Text クラスのインスタンス(テキストノード)が持つ、 11 * ノードのテキストコンテンツを保持するプロパティです。 12 * 通常、その値は string 型で、空の場合でも空文字列 ('') を返します。 13 */ 14function demonstrateDomTextNodeValue(): void 15{ 16 // 1. DOMDocument を初期化し、XMLドキュメントを作成します。 17 // XML バージョン 1.0, エンコーディング UTF-8 を指定 18 $dom = new DOMDocument('1.0', 'UTF-8'); 19 // 出力時に整形(インデントなど)するように設定します 20 $dom->formatOutput = true; 21 22 // 2. ルート要素 'data' を作成し、ドキュメントに追加します。 23 $rootElement = $dom->createElement('data'); 24 $dom->appendChild($rootElement); 25 26 // 3. テキストノードを持つ要素 'message' を作成します。 27 $messageElement = $dom->createElement('message'); 28 // 'message' 要素の子としてテキストノードを作成し、追加します。 29 $textNode = $dom->createTextNode('これは重要なメッセージです。'); 30 $messageElement->appendChild($textNode); 31 $rootElement->appendChild($messageElement); 32 33 // 4. 空のテキストノードを持つ要素 'empty_message' を作成します。 34 $emptyMessageElement = $dom->createElement('empty_message'); 35 // 空のテキストノードを作成し、'empty_message' 要素の子として追加します。 36 $emptyTextNode = $dom->createTextNode(''); 37 $emptyMessageElement->appendChild($emptyTextNode); 38 $rootElement->appendChild($emptyMessageElement); 39 40 // 5. テキストノードを持たない要素 'no_content' を作成します。 41 // この要素には子ノードもテキストも直接追加しません。 42 $noTextElement = $dom->createElement('no_content'); 43 $rootElement->appendChild($noTextElement); 44 45 echo "--- Dom\\Text::nodeValue の取得と操作例 ---" . PHP_EOL; 46 47 // 6. 'message' 要素の子ノード(テキストノード)から nodeValue を取得します。 48 // firstChild が Dom\Text のインスタンスであることを確認します。 49 if ($messageElement->firstChild instanceof Dom\Text) { 50 $node = $messageElement->firstChild; 51 echo "1. '<message>' 要素のテキストノードの値 (nodeValue): '" . $node->nodeValue . "'" . PHP_EOL; 52 } else { 53 echo "1. '<message>' 要素は Dom\\Text 型の子ノードを持ちません。" . PHP_EOL; 54 } 55 56 // 7. 'empty_message' 要素の子ノード(空のテキストノード)から nodeValue を取得します。 57 if ($emptyMessageElement->firstChild instanceof Dom\Text) { 58 $node = $emptyMessageElement->firstChild; 59 echo "2. '<empty_message>' 要素のテキストノードの値 (nodeValue): '" . $node->nodeValue . "'" . PHP_EOL; 60 } else { 61 echo "2. '<empty_message>' 要素は Dom\\Text 型の子ノードを持ちません。" . PHP_EOL; 62 } 63 64 // 8. テキストノードを持たない 'no_content' 要素の場合。 65 // firstChild は null になり、要素自体の nodeValue は空文字列となります。 66 if ($noTextElement->firstChild instanceof Dom\Text) { 67 // このブロックは実行されません。 68 $node = $noTextElement->firstChild; 69 echo "3. '<no_content>' 要素のテキストノードの値 (nodeValue): '" . $node->nodeValue . "'" . PHP_EOL; 70 } else { 71 echo "3. '<no_content>' 要素は Dom\\Text 型の子ノードを持ちません (または子ノードがありません)。" . PHP_EOL; 72 // DomElement の nodeValue は、その要素の全ての子孫テキストノードを連結したものです。 73 echo " '<no_content>' 要素自体の nodeValue: '" . $noTextElement->nodeValue . "'" . PHP_EOL; 74 } 75 76 echo PHP_EOL . "--- Dom\\Text オブジェクトを直接操作する例 ---" . PHP_EOL; 77 78 // 9. Dom\Text オブジェクトを直接作成し、nodeValue を操作します。 79 $standaloneText = new Dom\Text('これは独立したテキストノードです。'); 80 echo "4. 直接作成した Dom\\Text オブジェクトの初期 nodeValue: '" . $standaloneText->nodeValue . "'" . PHP_EOL; 81 82 // nodeValue は読み取り専用ではなく、値を変更することも可能です。 83 $standaloneText->nodeValue = 'この値は新しいテキストに変更されました。'; 84 echo "5. nodeValue 変更後の値: '" . $standaloneText->nodeValue . "'" . PHP_EOL; 85 86 // 空文字列も設定可能です。 87 $standaloneText->nodeValue = ''; 88 echo "6. nodeValue を空文字列に変更後: '" . $standaloneText->nodeValue . "'" . PHP_EOL; 89} 90 91// 上記のサンプルコードを実行します。 92demonstrateDomTextNodeValue(); 93
PHPのDom\Text::nodeValueプロパティは、XMLやHTMLドキュメント内の「テキストノード」が持つ実際のテキストコンテンツを操作するために使用されるプロパティです。Dom\Textクラスのインスタンスは、要素内に存在する純粋なテキスト部分を表しており、このnodeValueプロパティを通じて、そのテキストデータを取得したり、新しいテキストを設定したりできます。
このプロパティは引数を必要とせず、常にstring型の値を返します。例えば、<item>商品名</item>というXML要素の場合、"商品名"がテキストノードのnodeValueとなります。もしテキストノードが内容を持たない場合でも、このプロパティはnullではなく空文字列('')を返します。
サンプルコードでは、まずDOMDocumentを使ってXMLドキュメントを作成し、テキストノードを持つ要素や空のテキストノードを持つ要素を追加しています。messageElement->firstChildのようにして取得した子ノードがDom\Text型である場合に、そのnodeValueプロパティからテキストデータを取り出せることを示しています。また、nodeValueは値を代入してテキストコンテンツを直接変更することも可能です。これにより、動的なXMLコンテンツの生成や編集を行う際に非常に役立ちます。システムエンジニアとして、XMLやHTMLなどの構造化されたデータをプログラムで扱う際の基本的な操作として、このプロパティの理解は重要です。
Dom\Text::nodeValueは、XMLドキュメント内でテキストノードそのものが持つ文字列の内容を扱います。要素(DomElement)が持つnodeValueが、その要素内の全ての子孫テキストを連結したものであるのに対し、こちらは特定のテキストノードが保持する直接の値ですので混同しないよう注意が必要です。ノードのテキストが空の場合でも、通常nullではなく空文字列''を返します。また、firstChildなどで取得したノードが本当にDom\Text型であるかをinstanceofで確認することは、予期せぬエラーを防ぐために重要です。このプロパティは、値の取得だけでなく新しい文字列を設定してノードのテキスト内容を変更することも可能です。