【PHP8.x】DOMNotation::nodeValueプロパティの使い方
nodeValueプロパティの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
nodeValueプロパティは、DOMNotationクラスに属し、ノードのテキスト値を保持するプロパティです。
DOMNotationクラスは、XMLドキュメントのDTD(Document Type Definition、文書型定義)内で宣言される「記法」を表します。記法とは、例えばXMLドキュメント内で参照される外部のデータ(画像ファイルや動画ファイルなど)の種類やフォーマットを識別するために用いられるものです。具体的には、外部の非XMLデータがどのような形式であるかを名前で示す役割を持っています。
一般的に、DOM(Document Object Model)を構成するさまざまなノードタイプの多くでは、このnodeValueプロパティを使って、そのノードが直接持つテキストコンテンツや値を読み書きします。例えば、XML要素内のテキストデータや、属性の値などは、このnodeValueプロパティでアクセスされることがほとんどです。
しかし、DOMNotationノードの場合、その性質上、テキストコンテンツを直接保持しません。DOMNotationノード自体は、外部データの形式を定義する「名前」と、その名前に関連付けられた「識別子」(publicIdやsystemId)という情報を持っています。そのため、DOMNotationオブジェクトのnodeValueプロパティを参照すると、常にNULLを返します。これはエラーではなく、DOMNotationノードの特性に基づいた正常な動作です。DOMNotationノードが持つ名前や識別子の情報は、nodeNameプロパティやpublicId、systemIdといった別のプロパティを通じて取得することになります。
XMLドキュメントをプログラムで扱う際には、それぞれのノードタイプがどのような情報をどのプロパティで保持するのかを理解することが、正確な処理を行う上で非常に重要です。
構文(syntax)
1<?php 2// DTD に表記 (NOTATION) を含む XML を読み込む準備をします 3$dom = new DOMDocument(); 4$dom->loadXML('<!DOCTYPE example [<!NOTATION gif SYSTEM "image/gif">]><root/>'); 5 6// DOMDocumentType (DTD) から DOMNotation インスタンスを取得します 7// DOMNotation ノードは通常 DOMDocumentType::notations からアクセスされます 8$notation = $dom->doctype->notations->item(0); 9 10// DOMNotation::nodeValue プロパティにアクセスして値を取得します 11// DOMNotation の nodeValue は常に NULL です 12$nodeValue = $notation->nodeValue; 13?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
null
DOMNotation クラスの nodeValue プロパティは、ノードのテキスト内容を表します。このプロパティに値を設定することはできません。
サンプルコード
PHP DOMNotationのnodeValueを比較する
1<?php 2 3/** 4 * DOMNotationのnodeValueと、他のノードタイプでのnodeValueとtextContentの違いを比較します。 5 * 6 * リファレンス情報に基づき、DOMNotationのnodeValueが常にnullであることを示します。 7 * さらに、キーワード「php nodevalue vs textcontent」の意図を汲み、 8 * 比較対象としてDOMElementとDOMTextでの各プロパティの挙動を示し、違いを明確にします。 9 */ 10function compareNodeValueAndTextContent(): void 11{ 12 // DOMDocumentオブジェクトを作成します 13 $dom = new DOMDocument(); 14 15 // DTDを含むXML文字列を定義します。 16 // DOMNotationオブジェクトを取得するには、DTD内で記法(NOTATION)を宣言する必要があります。 17 // また、比較のためにテキストノードや要素も定義します。 18 $xmlString = <<<XML 19<?xml version="1.0" encoding="UTF-8"?> 20<!DOCTYPE doc [ 21 <!NOTATION jpeg PUBLIC "image/jpeg"> 22]> 23<doc> 24 <element>Some text<!-- comment --> and more text.</element> 25</doc> 26XML; 27 28 // XML文字列を読み込みます 29 $dom->loadXML($xmlString); 30 31 // --- 1. DOMNotation: nodeValueは常にnull --- 32 // リファレンス情報にあるDOMNotationのnodeValueプロパティを確認します。 33 echo "--- 1. DOMNotation ---" . PHP_EOL; 34 35 // doctypeプロパティからDOMDocumentTypeオブジェクトを取得します 36 $docType = $dom->doctype; 37 // notationsプロパティから 'jpeg' という名前のDOMNotationオブジェクトを取得します 38 $notation = $docType->notations->getNamedItem('jpeg'); 39 40 // 仕様により、DOMNotationのnodeValueは常にnullを返します。 41 echo 'nodeValue: '; 42 var_dump($notation->nodeValue); // 出力: NULL 43 // textContentも同様にnullです。 44 echo 'textContent: '; 45 var_dump($notation->textContent); // 出力: NULL 46 echo PHP_EOL; 47 48 49 // --- 2. 比較 (DOMElement): nodeValue vs textContent --- 50 // キーワード「nodeValue vs textContent」の違いを理解するため、 51 // 他のノードタイプと比較します。まずは要素ノード(Element)です。 52 echo "--- 2. DOMElement ---" . PHP_EOL; 53 54 // 'element'タグを持つDOMElementオブジェクトを取得します 55 $element = $dom->getElementsByTagName('element')->item(0); 56 57 // DOMElementのnodeValueは、要素自体がテキスト値を持たないため、nullを返します。 58 echo 'nodeValue: '; 59 var_dump($element->nodeValue); // 出力: NULL 60 61 // 一方、textContentは、その要素とすべての子孫からタグやコメントを除いた 62 // テキストコンテンツを連結して返します。 63 echo 'textContent: '; 64 var_dump($element->textContent); // 出力: string(24) "Some text and more text." 65 echo PHP_EOL; 66 67 68 // --- 3. 比較 (DOMText): nodeValue vs textContent --- 69 // 次に、テキストノード(Text)の場合です。 70 echo "--- 3. DOMText ---" . PHP_EOL; 71 72 // <element>の最初の子ノードであるDOMTextオブジェクトを取得します 73 $textNode = $element->firstChild; 74 75 // DOMTextのnodeValueは、ノードが持つテキストの内容そのものを返します。 76 echo 'nodeValue: '; 77 var_dump($textNode->nodeValue); // 出力: string(9) "Some text" 78 79 // DOMTextの場合、textContentはnodeValueと同じ値を返します。 80 echo 'textContent: '; 81 var_dump($textNode->textContent); // 出力: string(9) "Some text" 82 echo PHP_EOL; 83} 84 85// 関数を実行して結果を表示します 86compareNodeValueAndTextContent();
このPHPサンプルコードは、XML文書を操作するDOM拡張機能において、nodeValueプロパティとtextContentプロパティの挙動の違いを、ノードの種類ごとに比較して示しています。
まず、リファレンス情報にあるDOMNotationクラスのnodeValueプロパティに注目します。このプロパティは引数を取らず、仕様により常にnullを返します。コードの最初の部分では、DTD(文書型定義)で定義された記法(Notation)ノードを取得し、nodeValueとtextContentが共にnullであることを確認しています。
次に、より一般的なノードタイプとの比較を行います。DOMElement(要素ノード)の場合、nodeValueは要素自体がテキスト値を持たないためnullを返します。一方、textContentはその要素が持つ子孫のテキストコンテンツを全て連結した文字列を返します。
最後にDOMText(テキストノード)では、nodeValueとtextContentはどちらも同じ挙動となり、ノードが持つテキストの内容そのものを返します。このように、nodeValueとtextContentは似ていますが、どの種類のノードに対して使用するかによって取得できる値が異なるため、目的に応じた使い分けが重要です。
nodeValueプロパティは、扱うノードの種類によって返す値が大きく異なる点に注意が必要です。リファレンスにあるDOMNotationのように、記法宣言自体はテキスト値を持たないためnodeValueは常にnullを返します。また、要素(DOMElement)のテキストを取得したい場合もnodeValueはnullを返すため、子孫ノードのテキストをまとめて取得できるtextContentを使いましょう。一方で、テキストノード(DOMText)の場合はnodeValueとtextContentは同じテキスト内容を返します。このように、目的と対象ノードに応じて適切なプロパティを使い分けることが、DOM操作を正しく行うための鍵となります。