【PHP8.x】DOMText::childNodesプロパティの使い方
childNodesプロパティの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
childNodesプロパティは、DOMTextクラスに属し、ノードの子ノードのリストを保持するプロパティです。
PHPのDOM拡張機能において、DOMTextクラスは、HTMLやXMLドキュメント内でテキストデータそのものを表すノードです。例えば、<p>これはテキストです</p>というHTML要素がある場合、「これはテキストです」という部分がDOMTextノードとして扱われます。
一般的に、DOMツリー内のノードは、その下位にさらに他のノード(子ノード)を持つことがあります。これらの子ノードの集合は、childNodesプロパティを通じてDOMNodeListという形式で取得されます。DOMNodeListは、リストのように子ノードをまとめて扱い、個々のノードにアクセスするためのオブジェクトです。
しかし、DOMTextノードは「テキスト内容」そのものを表現するノードであり、他の要素ノードのように、さらにその内部に子ノードを持つことはできません。テキストノードはDOMツリーにおける最終的なデータ部分であり、それ以上細分化される構造ではないためです。
したがって、DOMTextオブジェクトからこのchildNodesプロパティにアクセスすると、常に子ノードが一つも含まれていない空のDOMNodeListオブジェクトが返されます。この挙動は、DOMTextノードが子ノードを持たないというDOMの構造的な特性を反映したものです。テキストノードの内容自体を取得したい場合は、nodeValueプロパティなどを使用するのが適切です。
構文(syntax)
1<?php 2$dom = new DOMDocument(); 3$element = $dom->createElement('p', 'これはテキストノードです。'); 4$dom->appendChild($element); 5 6// DOMElementの子ノードであるDOMTextノードを取得 7$textNode = $element->firstChild; // $textNode は DOMText のインスタンス 8 9// DOMTextノードのchildNodesプロパティにアクセス 10$childrenOfTextNode = $textNode->childNodes; 11 12// DOMTextノードは子ノードを持たないため、childNodesは常に空のDOMNodeListを返します 13// そのため、$childrenOfTextNode->length は常に 0 となります 14echo "DOMTextノードの子ノードの数: " . $childrenOfTextNode->length . "\n"; 15?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
DOMNodeList
DOMTextオブジェクトの直下の子ノードのリストをDOMNodeListクラスのインスタンスとして返します。
サンプルコード
PHP DOM childNodes プロパティの利用
1<?php 2 3// DOMText オブジェクトの childNodes プロパティの利用例 4 5// ドキュメントを新規に作成 6$dom = new DOMDocument(); 7 8// ルート要素を作成 9$root = $dom->createElement('root'); 10$dom->appendChild($root); 11 12// テキストノードを作成 13$textNode = $dom->createTextNode('Hello, world!'); 14 15// ルート要素にテキストノードを追加 16$root->appendChild($textNode); 17 18// テキストノードの childNodes プロパティを取得 19$childNodes = $textNode->childNodes; 20 21// childNodes は常に空の DOMNodeList を返す (テキストノードは子ノードを持たないため) 22echo "childNodes count: " . $childNodes->length . PHP_EOL;
このサンプルコードは、PHPのDOM拡張機能におけるDOMTextクラスのchildNodesプロパティの利用方法を示しています。DOMTextオブジェクトはテキストノードを表し、このテキストノードが持つ子ノードをDOMNodeListとして取得するためにchildNodesプロパティを使用します。
まず、DOMDocumentクラスを使って新しいXMLドキュメントを作成し、ルート要素を追加します。次に、createTextNode()メソッドを使用してテキストノードを作成し、それをルート要素の子ノードとして追加しています。
ここで重要なのは、DOMTextオブジェクト(テキストノード)は、それ自体がテキストデータを持つため、原則として子ノードを持ちません。そのため、$textNode->childNodesで取得できるDOMNodeListは常に空になります。
サンプルコードでは、$textNode->childNodesの結果を$childNodes変数に格納し、$childNodes->lengthプロパティを使って、取得したDOMNodeListに含まれるノードの数を表示しています。出力結果は「childNodes count: 0」となり、テキストノードが子ノードを持たないことを確認できます。
このように、childNodesプロパティは、ノードが持つ子ノードのリストを取得するために使用されますが、DOMTextオブジェクトの場合は常に空のリストが返される点に注意が必要です。この特性を理解することで、DOMを操作する際に予期せぬ動作を防ぐことができます。
DOMTextオブジェクトのchildNodesプロパティは、テキストノードの子ノードリストを取得するものですが、テキストノード自体は子ノードを持つことができません。そのため、$textNode->childNodesは常に空のDOMNodeListを返します。この点に注意してください。テキストノードの内容(テキストデータ)を取得したい場合は、nodeValueプロパティを使用します。childNodesプロパティは、主に要素ノード(DOMElementなど)の子ノードを取得する際に利用されます。誤ってテキストノードで使用しないように注意が必要です。