【PHP8.x】DOMProcessingInstruction::childNodesプロパティの使い方
childNodesプロパティの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
『childNodesプロパティは、この処理命令ノードのすべての子ノードの集合を保持するプロパティです。』
このプロパティにアクセスすると、子ノードを格納したDOMNodeListオブジェクトが返されます。しかし、XMLおよびHTMLの仕様上、処理命令ノード(Processing Instruction Node)は、要素ノードやテキストノードといった子ノードを構造的に持つことができません。そのため、DOMProcessingInstructionオブジェクトのchildNodesプロパティは、常にlengthプロパティが0である空のDOMNodeListオブジェクトを返します。このプロパティは読み取り専用であり、このプロパティを介して子ノードを追加したり削除したりすることはできません。より汎用的な親クラスであるDOMNodeから継承されているため存在しますが、DOMProcessingInstructionのインスタンスにおいては、常に空のノードリストを返すものとして機能します。
構文(syntax)
1<?php 2 3// DOMDocument を作成し、処理命令を含むXMLを読み込む 4$document = new DOMDocument(); 5$document->loadXML('<?xml version="1.0"?><?target data?><root/>'); 6 7// 処理命令ノード (DOMProcessingInstruction オブジェクト) を取得する 8$processingInstruction = $document->firstChild->nextSibling; 9 10// DOMProcessingInstruction オブジェクトの childNodes プロパティにアクセスする 11// (処理命令は子ノードを持たないため、常に空の DOMNodeList または null となる) 12$nodeList = $processingInstruction->childNodes; 13 14?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
?DOMNodeList
DOMProcessingInstruction::childNodesプロパティは、この処理命令ノードのすべての子ノードを格納したDOMNodeListを返します。
サンプルコード
PHP DOM Processing InstructionのchildNodesを取得する
1<?php 2 3/** 4 * DOMProcessingInstruction の childNodes プロパティの使用例を示します。 5 * 6 * 処理命令 (Processing Instruction) は、XML文書内でアプリケーションへの情報を 7 * 埋め込むためのノードです (例: <?php-app ... ?>)。 8 * 9 * DOMProcessingInstruction ノードは、その仕様上、子ノードを持つことができません。 10 * そのため、`childNodes` プロパティにアクセスしても、常に空のノードリスト 11 * (DOMNodeList) が返され、その length プロパティは 0 となります。 12 * このコードは、その動作を確認するものです。 13 */ 14function showProcessingInstructionChildNodes(): void 15{ 16 // 処理命令 '<?php-app ...?>' を含むXML文字列を準備 17 $xmlString = <<<XML 18<?xml version="1.0" encoding="UTF-8"?> 19<root> 20 <element>Some text</element> 21 <?php-app action="log" message="processing"?> 22</root> 23XML; 24 25 // DOMDocumentオブジェクトを生成し、XMLを読み込む 26 $dom = new DOMDocument(); 27 $dom->loadXML($xmlString); 28 29 // root要素の子ノードを順番に調べる 30 foreach ($dom->documentElement->childNodes as $node) { 31 // ノードが処理命令 (DOMProcessingInstruction) かどうかを判定 32 if ($node instanceof DOMProcessingInstruction) { 33 echo "処理命令ノードを発見しました。\n"; 34 echo "ターゲット (target): " . $node->target . "\n"; // <?php-app の 'php-app' 部分 35 echo "データ (data): " . $node->data . "\n\n"; // action="log" ... の部分 36 37 // DOMProcessingInstructionのchildNodesプロパティを取得 38 // 戻り値はDOMNodeListオブジェクト 39 $childNodes = $node->childNodes; 40 41 echo "childNodesプロパティの型: " . get_class($childNodes) . "\n"; 42 43 // 処理命令ノードは子ノードを持たないため、lengthは常に0になる 44 echo "子ノードの数 (length): " . $childNodes->length . "\n"; 45 46 break; // 最初の処理命令を見つけたらループを抜ける 47 } 48 } 49} 50 51// 関数を実行して結果を表示 52showProcessingInstructionChildNodes(); 53 54?>
PHPの DOMProcessingInstruction->childNodes プロパティは、処理命令ノードが持つ子ノードのリストを取得します。処理命令とは、XML文書内で <?target data?> のような形式で記述され、特定のアプリケーションに情報を伝えるための特別なノードです。
このプロパティにアクセスする際に引数は必要ありません。戻り値として、ノードの集合を管理するための DOMNodeList オブジェクトが返されます。
XMLの仕様上、処理命令ノードは子ノードを持つことができません。そのため、childNodes プロパティにアクセスすると、常に中身が空の DOMNodeList オブジェクトが返されます。結果として、このリストに含まれるノードの数を表す length プロパティの値は、常に 0 となります。
サンプルコードでは、まずXML文字列を読み込み、その中から <?php-app ...?> という処理命令ノードを探しています。そして、そのノードの childNodes プロパティを取得し、子ノードの数(length)が実際に 0 であることをコンソールに出力して確認しています。このコードは、処理命令ノードは子を持たないというルールを実証するものです。
このコードはXMLの処理命令(DOMProcessingInstruction)を扱います。最も重要な注意点は、この種のノードはXMLの仕様上、子ノードを持つことができないという点です。そのため、childNodesプロパティにアクセスしても、その中身は常に空になります。具体的にはnullではなく、要素数が0のDOMNodeListオブジェクトが返されます。このおかげで、$childNodes->lengthのようにプロパティを参照してもエラーにならず、常に0が返るため安全です。他のノードタイプであるDOMElementなどとは挙動が全く異なるため、今扱っているノードの型を意識することが正しい処理を記述する上で重要になります。