【PHP8.x】nodeValueプロパティの使い方
nodeValueプロパティの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
nodeValueプロパティは、ノードの値を文字列として取得または設定するプロパティです。DOMNameSpaceNodeクラスに属し、名前空間ノードのテキストコンテンツを操作するために使用されます。具体的には、ノードが持つテキストデータを参照したり、新しいテキストデータで置き換えたりできます。
このプロパティを使用することで、XMLドキュメントやHTMLドキュメント内の要素や属性の値をプログラムから読み書きすることが可能になります。例えば、要素のテキスト内容を取得したり、属性の値を変更したりする際に利用できます。
取得時には、ノードが持つテキストコンテンツが文字列として返されます。設定時には、指定された文字列がノードの新しいテキストコンテンツとして設定されます。もしノードがテキストコンテンツを持たない場合、取得時には空文字列が返されます。
注意点として、nodeValueプロパティは、すべてのノードタイプで意味を持つわけではありません。例えば、要素ノードの場合、直接的なテキストコンテンツを持たないため、nodeValueは通常nullを返します。要素ノードのテキストコンテンツを操作する場合は、代わりにchildNodesプロパティやtextContentプロパティを使用する必要があります。テキストノードや属性ノードなど、テキストコンテンツを直接持つノードに対しては、nodeValueプロパティが有効に機能します。
システムエンジニアを目指す初心者の方は、XMLやHTMLドキュメントを扱う際に、このnodeValueプロパティがデータの読み書きにおいて重要な役割を果たすことを理解しておくと良いでしょう。
構文(syntax)
1<?php 2$dom = new DOMDocument(); 3$element = $dom->createElementNS("http://www.example.com", "prefix:element", "some value"); 4$namespace = $element->namespaceURI; 5$nodeName = $element->nodeName; 6 7$domNameSpaceNode = new DOMNameSpaceNode($namespace, $nodeName); 8echo $domNameSpaceNode->nodeValue; 9?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
string|null
DOMNameSpaceNode の nodeValue プロパティは、名前空間ノードの実際の値(URI)を文字列として返します。ノードに値がない場合は null を返します。
サンプルコード
DOMNode::nodeValueとtextContentの比較
1<?php 2 3/** 4 * DOMNode::nodeValue と DOMNode::textContent の違いを比較するデモ。 5 * 6 * `nodeValue`はノードの種類によって取得できる値が異なります。 7 * - 要素ノード(DOMElement): null 8 * - テキストノード(DOMText): テキストの内容そのもの 9 * - 属性ノード(DOMAttr): 属性値 10 * - 名前空間ノード(DOMNameSpaceNode): 名前空間のURI 11 * 12 * 一方、`textContent`はノード自身とそのすべての子孫ノードからテキストを連結して取得します。 13 * これは主に要素ノードに対して有用です。 14 */ 15function demonstrateNodeValueVsTextContent(): void 16{ 17 header('Content-Type: text/plain; charset=utf-8'); 18 19 $xmlString = <<<XML 20<?xml version="1.0" encoding="UTF-8"?> 21<bookstore xmlns:bk="http://www.example.com/books"> 22 <book> 23 <title>PHP実践入門</title> 24 <!-- これはコメントです --> 25 著者: 匿名 26 </book> 27</bookstore> 28XML; 29 30 $dom = new DOMDocument(); 31 // 整形して出力するために true を設定 32 $dom->preserveWhiteSpace = false; 33 $dom->formatOutput = true; 34 $dom->loadXML($xmlString); 35 36 $xpath = new DOMXPath($dom); 37 38 // 1. 要素ノード (<book>) での比較 39 echo "--- 1. 要素ノード (<book>) ---\n"; 40 $bookElement = $xpath->query('//book')->item(0); 41 // 要素ノードの nodeValue は常に null です 42 echo 'nodeValue: ' . var_export($bookElement->nodeValue, true) . "\n"; 43 // textContent は子孫のテキストを連結して返します 44 echo 'textContent: ' . $bookElement->textContent . "\n\n"; 45 46 // 2. テキストノード ("著者: 匿名") での比較 47 echo "--- 2. テキストノード ('著者: 匿名') ---\n"; 48 $textNode = $xpath->query('//book/text()')->item(1); 49 // テキストノードの場合、nodeValue と textContent は同じ内容を返します 50 echo 'nodeValue: ' . $textNode->nodeValue . "\n"; 51 echo 'textContent: ' . $textNode->textContent . "\n\n"; 52 53 // 3. 名前空間ノード (xmlns:bk) での比較 (DOMNameSpaceNode) 54 echo "--- 3. 名前空間ノード (xmlns:bk) ---\n"; 55 // XPath を使って名前空間ノードを取得します 56 $namespaceNode = $xpath->query('//bookstore/namespace::bk')->item(0); 57 // DOMNameSpaceNode の nodeValue は名前空間URIを返します 58 echo 'nodeValue: ' . $namespaceNode->nodeValue . "\n"; 59 // 名前空間ノードにテキストコンテンツは存在しないため、空文字列になります 60 echo 'textContent: ' . $namespaceNode->textContent . "\n"; 61} 62 63demonstrateNodeValueVsTextContent();
このPHPサンプルコードは、XMLデータを操作する際に使われる nodeValue と textContent という2つのプロパティの挙動の違いを解説するものです。両者は似ているように見えますが、アクセスする対象(ノード)の種類によって役割が大きく異なります。
nodeValue は、ノードの種類に応じて異なる値を返すプロパティです。引数はなく、戻り値は文字列または null になります。サンプルコードで示されているように、要素ノードでは null を、テキストノードではそのテキスト内容を返します。そして、リファレンス情報にある DOMNameSpaceNode(名前空間ノード)に対して使用すると、その名前空間が示すURIを文字列として取得できます。
一方、textContent は、ノード自身とその配下にあるすべての子孫ノードのテキストを連結して、一つの文字列として返します。XMLの構造は無視され、人間が読むテキスト部分だけをまとめて抽出したい場合に非常に便利です。
このコードは、①要素ノード、②テキストノード、③名前空間ノードという3つの異なる種類のノードに対して両方のプロパティを呼び出し、その結果を比較しています。この比較を通して、XMLから取得したい情報の種類に応じて、nodeValue と textContent を適切に使い分けることの重要性を理解することができます。
nodeValueプロパティは、扱うノードの種類によって取得できる値が大きく異なる点に注意が必要です。特に、サンプルコードの<book>のような要素ノードに対してnodeValueを使用すると常にnullが返ってきます。要素が持つテキスト内容を取得したい場合は、子孫要素のテキストもまとめて取得するtextContentプロパティを使いましょう。一方、テキストノードや属性ノードなど、特定の値を持つノードから直接値を取り出したい場合にnodeValueは有効です。また、XPathでノードを取得する際、対象が見つからないと結果がnullになるため、利用前に存在チェックを行うとより安全なコードになります。この2つのプロパティの挙動の違いを理解し、目的に応じて正しく使い分けることが重要です。
PHP XML DOMNameSpaceNodeのnodeValueを取得する
1<?php 2 3/** 4 * DOMNameSpaceNodeのnodeValueプロパティの使用例を示します。 5 * 6 * XMLの名前空間ノードを抽出し、その値(名前空間URI)を表示します。 7 */ 8function getNamespaceUriExample(): void 9{ 10 // 名前空間 (xmlns:book) を含むXML文字列を定義 11 $xmlString = <<<XML 12<?xml version="1.0" encoding="UTF-8"?> 13<shelf xmlns:book="http://www.example.com/books"> 14 <book:title>PHP実践入門</book:title> 15</shelf> 16XML; 17 18 // DOMDocumentオブジェクトを生成し、XMLを読み込む 19 $doc = new DOMDocument(); 20 $doc->loadXML($xmlString); 21 22 // DOMXPathオブジェクトを生成し、XPathクエリを実行できるようにする 23 $xpath = new DOMXPath($doc); 24 25 // XPathクエリで<shelf>要素の名前空間ノードを取得する 26 // `namespace::*` は、指定した要素のすべての名前空間ノードを選択する 27 $namespaceNodes = $xpath->query('//shelf/namespace::*'); 28 29 // 取得した名前空間ノードが1つ以上あるか確認 30 if ($namespaceNodes->length > 0) { 31 // 最初の名前空間ノードを取得 (この例では xmlns:book) 32 // $namespaceNode は DOMNameSpaceNode オブジェクトです 33 $namespaceNode = $namespaceNodes[0]; 34 35 // nodeName プロパティは名前空間の宣言全体 (例: "xmlns:book") を返す 36 echo "nodeName: " . $namespaceNode->nodeName . PHP_EOL; 37 38 // nodeValue プロパティは名前空間のURI (例: "http://www.example.com/books") を返す 39 echo "nodeValue: " . $namespaceNode->nodeValue . PHP_EOL; 40 } 41} 42 43// 関数を実行 44getNamespaceUriExample(); 45
PHPのDOMNameSpaceNodeクラスが持つnodeValueプロパティは、XML文書内にある名前空間ノードの値、つまり名前空間URIを取得するために使用されます。このプロパティは読み取り専用で、値を取得する際に引数は必要ありません。
サンプルコードでは、xmlns:book="http://www.example.com/books"という名前空間を含むXML文字列を扱っています。まずDOMDocumentとDOMXPathを使い、XPathクエリ//shelf/namespace::*を実行して<shelf>要素に定義された名前空間ノードを取得します。このとき取得されるノードはDOMNameSpaceNodeオブジェクトです。
このオブジェクトのnodeValueプロパティにアクセスすると、名前空間のURIであるhttp://www.example.com/booksという文字列が返されます。これは、名前空間が指し示す一意な識別子そのものです。比較として、nodeNameプロパティはxmlns:bookのような接頭辞を含んだ名前を返します。nodeValueプロパティの戻り値は、名前空間URIを表す文字列型(string)ですが、値が存在しない場合はnullを返すことがあります。
DOMNameSpaceNodeのnodeValueプロパティは、XMLの名前空間のURIを文字列として返します。nodeNameが接頭辞を含む宣言全体(例: xmlns:book)を返すのに対し、nodeValueはURI部分のみを返すという違いを理解することが重要です。この名前空間ノードは特殊なノードであり、サンプルコードのようにXPathのnamespace::*構文を使って取得するのが一般的です。XPathクエリの実行結果は、該当するノードが存在しない場合、空のリストを返します。そのため、取得したリストの要素にアクセスする前には、必ずlengthプロパティなどで要素が存在するかどうかを確認してください。このチェックを怠ると、存在しない要素へアクセスしようとしてエラーが発生する原因となります。