【PHP8.x】Dom\Notation::nodeValueプロパティの使い方
nodeValueプロパティの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
nodeValueプロパティは、Dom\Notationクラスのノードの値を保持するプロパティです。Dom\Notationクラスは、XML文書のDOCTYPE宣言で定義される、外部エンティティや処理命令で使用される「記法(Notation)」を表すためのDOMノードです。
一般的なDOMノードのnodeValueプロパティは、そのノードのテキストコンテンツやコメント内容などを取得するために使用されますが、Dom\Notationノードの場合、本質的に直接的なテキスト値や内容を持ちません。そのため、このnodeValueプロパティにアクセスしても、常にnullが返されます。これは、Dom\Notationノードが、値そのものではなく、特定の記法に関するメタ情報(名前、公開識別子、システム識別子など)を保持する構造であるためです。
このプロパティは読み取り専用であり、値を設定しようとしても無視され、効果はありません。Dom\Notationノードが持つ具体的な記法名や、外部リソースへの参照情報を取得したい場合は、nameプロパティ、publicIdプロパティ、およびsystemIdプロパティを使用してください。これにより、記法の詳細な情報を正確に取得することができます。
構文(syntax)
1<?php 2$xml = <<<EOT 3<!DOCTYPE root [ 4 <!NOTATION mynotation SYSTEM "some/system/id"> 5]> 6<root/> 7EOT; 8 9$dom = new DOMDocument(); 10$dom->loadXML($xml); 11 12$doctype = $dom->doctype; 13 14if ($doctype && $doctype->notations && $doctype->notations->length > 0) { 15 $notation = $doctype->notations->item(0); 16 echo $notation->nodeValue; 17} 18?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
string|null
このプロパティは、ノードのテキストコンテンツを文字列として返します。ノードにテキストコンテンツがない場合は、nullを返します。
サンプルコード
PHP DOMNotation nodeValue を取得する
1<?php 2 3/** 4 * DOMNotationのnodeValueプロパティの使用例を示します。 5 * 6 * DTD(文書型定義)で宣言された記法(Notation)ノードを取得し、 7 * そのプロパティを表示します。DOMNotationのnodeValueは常にnullを返します。 8 */ 9function showNotationNodeValueExample(): void 10{ 11 // DTD内で'jpeg'という記法を宣言したXML文字列を準備します。 12 $xmlString = <<<XML 13<?xml version="1.0" encoding="UTF-8"?> 14<!DOCTYPE document [ 15 <!NOTATION jpeg PUBLIC "image/jpeg"> 16]> 17<document /> 18XML; 19 20 // DOMDocumentオブジェクトをインスタンス化します。 21 $dom = new DOMDocument(); 22 23 // XML文字列を読み込みます。 24 $dom->loadXML($xmlString); 25 26 // DocumentTypeノード(<!DOCTYPE ...>)を取得します。 27 $doctype = $dom->doctype; 28 29 // notationsプロパティから、指定した名前の記法ノードを取得します。 30 // $doctype->notations は DOMNamedNodeMap オブジェクトです。 31 /** @var Dom\Notation|null $notation */ 32 $notation = $doctype->notations->getNamedItem('jpeg'); 33 34 if ($notation) { 35 // 記法ノードの各プロパティの値を出力します。 36 echo "nodeName: " . $notation->nodeName . PHP_EOL; // 出力: jpeg 37 echo "publicId: " . $notation->publicId . PHP_EOL; // 出力: image/jpeg 38 39 // DOMNotationのnodeValueプロパティは、仕様上常にnullを返します。 40 echo "nodeValue: "; 41 var_dump($notation->nodeValue); // 出力: NULL 42 } 43} 44 45// 関数を実行して結果を表示します。 46showNotationNodeValueExample(); 47
PHPのDom\Notationクラスに属するnodeValueプロパティについて解説します。このプロパティは記法(Notation)ノードの値を取得するために使用されます。記法ノードとは、DTD(文書型定義)内で宣言される、XML文書外のデータ形式を指すためのものです。
このプロパティに引数はありません。戻り値の型はstring|nullですが、DOMの仕様上、記法ノードは値を持たないため、nodeValueプロパティは常にnullを返します。
サンプルコードでは、まずDTD内でjpegという記法を宣言したXMLデータを作成しています。次にDOMDocumentオブジェクトを使ってこのXMLを読み込み、doctypeプロパティから文書型定義ノードを取得します。さらに、その中にあるnotationsプロパティからgetNamedItemメソッドを使って、jpegという名前の記法ノードを取得します。
取得した記法ノードのnodeNameには名前(jpeg)、publicIdには公開識別子(image/jpeg)が格納されていることが確認できます。一方で、nodeValueプロパティにアクセスすると、仕様通りnullが返されます。このように、このプロパティは他のノードタイプとは異なり、具体的な値を持たないという特徴があります。
Dom\NotationクラスのnodeValueプロパティは、仕様により常にnullを返します。テキストノードなど他のノードと同じように値が取得できると誤解しやすいため注意が必要です。記法に関する情報、この例では「image/jpeg」のような識別子を取得したい場合は、nodeValueの代わりにpublicIdやsystemIdといったプロパティを使用します。また、getNamedItemメソッドは指定した記法が存在しない場合にnullを返すことがあります。プロパティへアクセスする前には、サンプルコードのようにif文などでnullでないことを必ず確認してください。このチェックは予期せぬエラーを防ぐために非常に重要です。
PHP nodeValueで記法を取得する
1<?php 2 3/** 4 * DOMNotationのnodeValueプロパティの使用例を示します。 5 * 6 * このプロパティは、仕様により常にnullを返します。 7 * このサンプルでは、DTD(文書型定義)内の記法(Notation)を抽出し、 8 * そのプロパティ(nodeName, publicId, systemId, nodeValue)を表示します。 9 * HTMLでもDOCTYPE宣言は使われますが、記法のデモンストレーションにはXMLが適しています。 10 */ 11function demonstrateNotationNodeValue(): void 12{ 13 // DTD内で記法(NOTATION)を定義したXML文字列 14 $xmlString = <<<XML 15 <?xml version="1.0" encoding="UTF-8"?> 16 <!DOCTYPE document [ 17 <!NOTATION jpg SYSTEM "image/jpeg"> 18 <!NOTATION png PUBLIC "-//PNG Consortium//NOTATION PNG File Format//EN"> 19 ]> 20 <document></document> 21 XML; 22 23 // DOMDocumentオブジェクトを作成してXMLを読み込む 24 $doc = new DOMDocument(); 25 $doc->loadXML($xmlString); 26 27 // 文書型 (DOCTYPE) ノードを取得します。 28 // このノードは記法 (Notation) の情報を含んでいます。 29 $doctype = $doc->doctype; 30 31 // 記法のリスト(DOMNamedNodeMap)が存在するか確認 32 if ($doctype && $doctype->notations->length > 0) { 33 echo "文書内で見つかった記法(Notation):" . PHP_EOL; 34 echo "------------------------------------" . PHP_EOL; 35 36 // 各記法(DOMNotationオブジェクト)をループ処理 37 /** @var DOMNotation $notation */ 38 foreach ($doctype->notations as $notation) { 39 // 記法名(nodeNameプロパティ) 40 echo "記法名 (nodeName): " . $notation->nodeName . PHP_EOL; 41 42 // 公開識別子(publicIdプロパティ) 43 echo "Public ID: " . $notation->publicId . PHP_EOL; 44 45 // システム識別子(systemIdプロパティ) 46 echo "System ID: " . $notation->systemId . PHP_EOL; 47 48 // nodeValueプロパティは、DOMNotationの場合、常にnullを返します。 49 echo "nodeValue: "; 50 var_dump($notation->nodeValue); 51 echo "------------------------------------" . PHP_EOL; 52 } 53 } else { 54 echo "この文書には記法(Notation)が見つかりませんでした。" . PHP_EOL; 55 } 56} 57 58// 関数を実行 59demonstrateNotationNodeValue(); 60 61?>
Dom\NotationクラスのnodeValueプロパティは、XMLやHTMLのDTD(文書型定義)で定義された記法(Notation)ノードの値を取得するために用意されています。しかし、DOMの仕様により記法ノード自体は値を持たないため、このプロパティはアクセスしても常にnullを返します。
このプロパティは引数を取りません。戻り値は常にnullとなります。
サンプルコードでは、まずDTD内で「jpg」と「png」という2つの記法を定義したXML文字列を準備します。次にDOMDocumentオブジェクトでこのXMLを解析し、文書型ノード(doctype)から記法のリスト(notations)を取得します。foreachループ処理の中で、それぞれの記法オブジェクトから名前(nodeName)や識別子(publicId, systemId)などの情報を表示します。最後にnodeValueプロパティの値を出力すると、var_dumpの結果が示す通りNULLであることが確認できます。これは、記法ノードではnodeValueに意味のある値が格納されないことを示しています。
このコードの重要な点は、DOMNotationオブジェクトのnodeValueプロパティが仕様上、常にnullを返すことです。他のノード(例えばテキストノード)と同じように値が取得できると期待すると、意図しない結果になりますので注意してください。記法に関する情報は、nodeValueではなくnodeName、publicId、systemIdといったプロパティから取得します。このサンプルはXMLのDTD(文書型定義)を対象としており、一般的なHTML文書の解析で記法を直接扱うことはまれです。また、DOCTYPE宣言が存在しない文書では$doc->doctypeがnullになるため、プロパティにアクセスする前のif文による存在確認はエラーを防ぐために不可欠です。