【PHP8.x】childNodesプロパティの使い方
childNodesプロパティの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
『childNodesプロパティは、特定のDOM要素(Dom\Elementオブジェクト)の直接の子であるすべてのノードのコレクションを、Dom\NodeListオブジェクトとして保持するプロパティです。このプロパティが返すノードリストには、子要素(Dom\Element)だけでなく、テキスト(Dom\Text)、コメント(Dom\Comment)、処理命令(Dom\ProcessingInstruction)など、あらゆる種類のノードが含まれます。特に注意すべき点として、HTMLやXMLソースコード内の要素間の空白や改行もテキストノードとして扱われ、このリストに含まれることがあります。childNodesが返すDom\NodeListは「ライブコレクション」であり、元の要素の子ノードがスクリプトによって追加または削除されると、このリストの内容も自動的に更新されます。したがって、DOM構造を動的に変更しながらノードを操作する場合でも、常に最新の状態を参照することができます。すべての子ノードを順番に処理したい場合に便利ですが、要素ノードのみを対象としたい場合は、childrenプロパティを使用する方がより簡潔なコードになります。
構文(syntax)
1<?php 2 3$html = '<div><p>Paragraph 1</p><p>Paragraph 2</p></div>'; 4 5$dom = new \Dom\Document(); 6$dom->loadHTML($html); 7 8// <div> 要素を取得 9$element = $dom->getElementsByTagName('div')[0]; 10 11// $element の子ノードのリスト (DOMNodeList) を取得 12$nodeList = $element->childNodes; 13 14// 子ノードの数を表示 15echo $nodeList->length; // 2 16 17?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
DOMNodeList
Dom\Element クラスの childNodes プロパティは、その要素の子ノードのコレクションである DOMNodeList を返します。このリストには、要素ノード、テキストノード、コメントノードなどが含まれます。
サンプルコード
PHP DOM ElementのchildNodesを取得する
1<?php 2 3// DOMDocumentを新規作成 4$dom = new DOMDocument(); 5 6// HTMLをロード 7$dom->loadHTML('<html><body><div><p>Hello</p><p>World</p></div></body></html>'); 8 9// div要素を取得 10$div = $dom->getElementsByTagName('div')->item(0); 11 12// div要素の子ノードリストを取得 13$childNodes = $div->childNodes; 14 15// 子ノードリストをループして表示 16foreach ($childNodes as $node) { 17 // ノードタイプがELEMENT_NODEの場合のみ処理 18 if ($node->nodeType == XML_ELEMENT_NODE) { 19 echo $node->nodeName . PHP_EOL; // ノード名を表示 (p) 20 echo $node->textContent . PHP_EOL; // ノードのテキストコンテンツを表示 (Hello, World) 21 } 22} 23 24?>
PHPのDOM拡張におけるDom\ElementクラスのchildNodesプロパティは、指定した要素のすべての子ノードを含むDOMNodeListオブジェクトを返します。このプロパティを使用することで、要素直下のノード(要素、テキスト、コメントなど)にアクセスし、操作を行うことができます。
上記のサンプルコードでは、まずDOMDocumentオブジェクトを作成し、HTML文字列をロードしています。次に、getElementsByTagNameメソッドを使ってdiv要素を取得し、そのchildNodesプロパティにアクセスして子ノードのリストを取得しています。
取得したDOMNodeListオブジェクトは、foreachループで反復処理できます。ループ内では、各ノードのnodeTypeプロパティを調べて、要素ノード(XML_ELEMENT_NODE)であるかどうかを確認しています。要素ノードの場合、nodeNameプロパティでノード名(この場合はp)を、textContentプロパティでノードのテキストコンテンツ(この場合はHelloとWorld)を取得し、それぞれ出力しています。
childNodesプロパティは、要素の子ノードを順に処理したい場合に非常に便利です。特に、HTMLやXMLドキュメントを解析し、特定の要素の子要素に対して何らかの処理を行いたい場合に役立ちます。戻り値であるDOMNodeListは、ライブリストであるため、リストの内容がドキュメントの変更に応じて動的に更新される点に注意が必要です。
childNodesプロパティは、要素直下の全ての子ノードをDOMNodeListとして返します。テキストノードやコメントノードなども含まれるため、nodeTypeで要素ノード(XML_ELEMENT_NODE)かどうかを確認する必要があります。item()メソッドで特定のインデックスのノードにアクセスする際、インデックスが存在しない場合はnullを返すことに注意してください。DOMNodeListはライブリストであり、ノードの追加や削除を行うと動的に更新されます。textContentプロパティは、要素とその子孫要素のテキストコンテンツを結合して返します。HTMLエンコードされた文字列を扱う際は、必要に応じてデコード処理を行ってください。
PHP DOMElement childNodesで子要素を取得する
1<?php 2 3// DOMDocument を作成し、XML 文字列をロードします。 4$dom = new DOMDocument(); 5$dom->loadXML('<root><child1>Value 1</child1><child2>Value 2</child2></root>'); 6 7// root 要素を取得します。 8$root = $dom->documentElement; 9 10// root 要素の子ノードリストを取得します。 11$childNodes = $root->childNodes; 12 13// 子ノードを順番に処理します。 14foreach ($childNodes as $node) { 15 // ノードタイプが ELEMENT_NODE (要素ノード) であるか確認します。 16 if ($node->nodeType === XML_ELEMENT_NODE) { 17 // 要素ノードの名前と値を出力します。 18 echo "Node Name: " . $node->nodeName . "\n"; 19 echo "Node Value: " . $node->nodeValue . "\n"; 20 } 21} 22 23?>
このサンプルコードは、PHPのDOM拡張を用いて、XMLドキュメントの子ノードを操作する方法を示しています。まず、DOMDocumentクラスのインスタンスを作成し、loadXML()メソッドでXML文字列を読み込みます。次に、documentElementプロパティを使用して、XMLドキュメントのルート要素を取得します。
childNodesプロパティは、Dom\Elementクラスに所属しており、指定された要素のすべての子ノードを含むDOMNodeListオブジェクトを返します。このサンプルでは、ルート要素のchildNodesプロパティにアクセスすることで、ルート要素直下のすべての子ノードのリストを取得しています。
取得したDOMNodeListオブジェクトは、foreachループを用いて反復処理を行います。各ノードのnodeTypeプロパティをチェックし、XML_ELEMENT_NODE(要素ノード)であるかどうかを確認します。要素ノードであれば、nodeNameプロパティで要素の名前、nodeValueプロパティで要素の値をそれぞれ取得し、出力します。
このコードを実行することで、XMLドキュメント内の要素を順番に処理し、要素名と要素の値を取得することができます。childNodesプロパティは、XMLドキュメントの構造を解析し、特定の要素の子要素にアクセスする際に非常に役立ちます。
childNodesは、要素の子ノードをDOMNodeListとして返します。このリストはライブであるため、DOM構造が変更されると自動的に更新されます。childNodesで取得できるのは、要素ノードだけでなく、テキストノードやコメントノードなども含まれる点に注意が必要です。サンプルコードではnodeTypeを使って要素ノードのみを処理していますが、他のノードタイプも考慮する必要がある場合に備えましょう。また、nodeValueは要素ノードの場合、子孫テキストノードを連結した値を返します。属性の値を取得したい場合は、getAttributeメソッドを使用します。