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

【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 DOMDocument nodeValue を取得する

1<?php
2
3/**
4 * DOMNotation クラスの nodeValue プロパティの動作を示すサンプルコードです。
5 * DOMNotation は XML の NOTATION 宣言を表し、その nodeValue プロパティは常に null を返します。
6 *
7 * @param string $xmlString XMLドキュメントの文字列。NOTATION宣言を含む必要があります。
8 */
9function demonstrateDomNotationNodeValue(string $xmlString): void
10{
11    // 1. DOMDocument オブジェクトを作成します。
12    $dom = new DOMDocument();
13
14    // 2. XML 文字列を DOMDocument にロードします。
15    // loadXML は成功した場合に true を、失敗した場合に false を返します。
16    if (!$dom->loadXML($xmlString)) {
17        echo "エラー: XMLのロードに失敗しました。\n";
18        return;
19    }
20
21    echo "XMLが正常にロードされました。\n";
22
23    // 3. ドキュメントタイプ (DOCTYPE) オブジェクトを取得します。
24    // DOMDocumentType は DOMDocument の doctype プロパティからアクセスできます。
25    $docType = $dom->doctype;
26
27    if ($docType === null) {
28        echo "情報: DOCTYPE宣言がXMLに見つかりませんでした。\n";
29        return;
30    }
31
32    echo "DOCTYPE宣言が見つかりました: " . $docType->name . "\n";
33
34    // 4. DOMDocumentType から NOTATION のリスト (DOMNamedNodeMap) を取得します。
35    // notations プロパティは、宣言されたすべての NOTATION ノードを保持します。
36    $notations = $docType->notations;
37
38    if ($notations->count() === 0) {
39        echo "情報: DOCTYPE内にNOTATION宣言が見つかりませんでした。\n";
40        return;
41    }
42
43    // 5. 特定の NOTATION ノードを名前で取得します。
44    // 今回のXML文字列には 'myNotation' という名前の NOTATION が含まれています。
45    /** @var DOMNotation|null $myNotation */
46    $myNotation = $notations->getNamedItem('myNotation');
47
48    if ($myNotation === null) {
49        echo "エラー: 'myNotation' という名前のDOMNotationが見つかりませんでした。\n";
50        return;
51    }
52
53    echo "DOMNotation ノード '{$myNotation->nodeName}' が見つかりました。\n";
54
55    // 6. DOMNotation オブジェクトの nodeValue プロパティにアクセスします。
56    // DOMNotation の nodeValue は常に null を返します。
57    $nodeValue = $myNotation->nodeValue;
58
59    echo "DOMNotation->nodeValue の値: ";
60    var_dump($nodeValue); // nodeValueがnullであることを確認します。
61
62    if ($nodeValue === null) {
63        echo "期待通り、DOMNotation の nodeValue は null でした。\n";
64    } else {
65        echo "警告: DOMNotation の nodeValue が null ではありませんでした。\n";
66    }
67}
68
69// サンプルで使用するXML文字列を定義します。
70// このXMLには、NOTATION宣言を含むDOCTYPEが含まれています。
71$sampleXml = <<<XML
72<?xml version="1.0"?>
73<!DOCTYPE root [
74  <!NOTATION myNotation SYSTEM "my-notation-processor.exe">
75  <!ELEMENT root EMPTY>
76]>
77<root/>
78XML;
79
80// 関数を実行して、DOMNotationのnodeValueの動作を実演します。
81demonstrateDomNotationNodeValue($sampleXml);
82

PHPのDOM拡張機能は、XMLドキュメントをプログラムで操作するための標準的な方法を提供します。このサンプルコードは、XMLのNOTATION宣言を表現するDOMNotationクラスとそのnodeValueプロパティの挙動を示すものです。

DOMNotationは、XMLドキュメント型定義(DTD)内で外部の処理系やデータ形式を宣言するNOTATION(記法)をオブジェクトとして扱います。一般的に、nodeValueプロパティはXMLノードのテキスト内容を表しますが、DOMNotationクラスのnodeValueプロパティは特殊な性質を持っています。このプロパティには引数がなく、常にnullを戻り値として返します。これは、NOTATIONノード自体が具体的なテキスト内容を持たず、外部リソースへの参照や識別子を定義する役割を果たすためです。

サンプルコードでは、まずXMLドキュメントをロードし、その中からNOTATION宣言を含むDOCTYPE情報を取得します。次に、特定のNOTATION(例としてmyNotation)を表すDOMNotationオブジェクトを探し出して取得します。最後に、取得したDOMNotationオブジェクトのnodeValueプロパティにアクセスし、その値がnullであることをvar_dump関数を使って確認しています。このコードを通じて、DOMNotationがテキストデータを持たない特殊なノードであり、そのためnodeValueが常にnullとなるというPHP DOMの仕様を理解することができます。

「DOMNotation」クラスの「nodeValue」プロパティは、常に「null」を返しますので、他のDOMノードのように具体的な文字列値が格納されていると期待しないよう注意が必要です。これは、DOMNotationがXMLの「NOTATION」宣言を表す特別なノードであり、この宣言自体は外部の非XMLデータを処理するための形式やプロセッサを識別するもので、直接的なテキスト値を持たないためです。サンプルコードでは、「DOMDocument」オブジェクトから「DOCTYPE」宣言、そして「NOTATION」宣言へと段階的にアクセスし、「DOMNotation」インスタンスを取得しています。最終的に「var_dump」で「nodeValue」が「null」であることを確認する手順は、このプロパティの挙動を理解する上で非常に重要です。この特性を理解していれば、意図しない値が返されるという誤解を防げます。

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)ノードを取得し、nodeValuetextContentが共にnullであることを確認しています。

次に、より一般的なノードタイプとの比較を行います。DOMElement(要素ノード)の場合、nodeValueは要素自体がテキスト値を持たないためnullを返します。一方、textContentはその要素が持つ子孫のテキストコンテンツを全て連結した文字列を返します。

最後にDOMText(テキストノード)では、nodeValuetextContentはどちらも同じ挙動となり、ノードが持つテキストの内容そのものを返します。このように、nodeValuetextContentは似ていますが、どの種類のノードに対して使用するかによって取得できる値が異なるため、目的に応じた使い分けが重要です。

nodeValueプロパティは、扱うノードの種類によって返す値が大きく異なる点に注意が必要です。リファレンスにあるDOMNotationのように、記法宣言自体はテキスト値を持たないためnodeValueは常にnullを返します。また、要素(DOMElement)のテキストを取得したい場合もnodeValuenullを返すため、子孫ノードのテキストをまとめて取得できるtextContentを使いましょう。一方で、テキストノード(DOMText)の場合はnodeValuetextContentは同じテキスト内容を返します。このように、目的と対象ノードに応じて適切なプロパティを使い分けることが、DOM操作を正しく行うための鍵となります。

関連コンテンツ

関連プログラミング言語

【PHP8.x】DOMNotation::nodeValueプロパティの使い方 | いっしー@Webエンジニア