【PHP8.x】childNodesプロパティの使い方
childNodesプロパティの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
childNodesプロパティは、DOMNodeオブジェクトの子ノードを保持するプロパティです。このプロパティは、DOMNodeオブジェクトが持つ全ての子ノードをNodeListオブジェクトとして返します。NodeListオブジェクトは、ノードの順序付きリストであり、インデックスを使用して個々のノードにアクセスできます。
childNodesプロパティは読み取り専用であり、直接値を設定することはできません。子ノードを変更するには、DOMDocumentオブジェクトが提供するメソッド(appendChild、insertBefore、removeChildなど)を使用する必要があります。
childNodesプロパティを使用することで、DOMツリーを辿り、特定の要素の子ノードを効率的に取得できます。取得したNodeListオブジェクトをループ処理することで、各子ノードに対して必要な操作を実行できます。
例えば、あるHTML要素(DOMNodeオブジェクト)の子要素をすべて取得し、それぞれの要素のテキストコンテンツを出力する場合などにchildNodesプロパティが役立ちます。これにより、Webページの構造をプログラム的に解析し、必要な情報を抽出したり、動的にコンテンツを生成したりすることが可能になります。DOM操作における基本的なプロパティの一つであり、DOMDocumentとDOMNodeオブジェクトを理解する上で重要な役割を果たします。
構文(syntax)
1DOMNode::$childNodes;
引数(parameters)
引数なし
引数はありません
戻り値(return)
DOMNodeList
DOMNodeオブジェクトの子ノードのコレクション(DOMNodeList)を返します。
サンプルコード
PHP DOM childNodes で子ノードを列挙する
1<?php 2 3/** 4 * HTML文字列からDOM要素の子ノードを列挙するサンプル関数。 5 * 6 * この関数は、システムエンジニアを目指す初心者がDOM操作の基本、特に 7 * DOMNode::childNodes プロパティの使い方を理解できるように設計されています。 8 * 指定されたHTML文字列をパースし、<body>要素の子ノードを検索して、 9 * そのタイプと内容を表示します。 10 */ 11function displayBodyChildNodesExample(): void 12{ 13 // 1. サンプルとなるHTML文字列を定義 14 $html = <<<HTML 15<!DOCTYPE html> 16<html> 17<head> 18 <title>DOM ChildNodes サンプル</title> 19</head> 20<body> 21 <h1>DOM操作の基本</h1> 22 <p>この段落は<body>要素の直接の子です。</p> 23 <div> 24 <span>これはネストされた要素です。</span> 25 <!-- ここにコメントがあります --> 26 また別のテキストノード。 27 </div> 28 最後の段落。 29</body> 30</html> 31HTML; 32 33 // 2. DOMDocumentオブジェクトを初期化し、HTMLをロード 34 $dom = new DOMDocument(); 35 // HTMLのパース中に発生する警告を抑制(libxml_clear_errorsで後でクリア) 36 libxml_use_internal_errors(true); 37 $dom->loadHTML($html); 38 libxml_clear_errors(); // 蓄積されたエラーをクリア 39 40 echo "--- DOMNode::childNodes プロパティの使用例 ---\n\n"; 41 echo "対象HTML:\n" . $html . "\n\n"; 42 43 // 3. 'body'要素を取得 44 // getElementsByTagNameはDOMNodeListを返すため、最初の要素(.item(0))を取得します。 45 $bodyElements = $dom->getElementsByTagName('body'); 46 if ($bodyElements->count() === 0) { 47 echo "エラー: 'body'要素が見つかりませんでした。\n"; 48 return; 49 } 50 $bodyNode = $bodyElements->item(0); 51 52 echo "<body>要素の直接の子ノードを列挙します:\n"; 53 54 // 4. DOMNode::childNodes プロパティにアクセスして子ノードリストを取得 55 // このプロパティはDOMNodeListオブジェクトを返します。 56 $childNodes = $bodyNode->childNodes; 57 58 // 5. DOMNodeList をループし、各子ノードの情報を表示 59 foreach ($childNodes as $index => $node) { 60 echo " [子ノード " . ($index + 1) . "]:\n"; 61 echo " ノード名: " . $node->nodeName; // 要素ノードはタグ名、テキストノードは #text、コメントノードは #comment 62 echo " (タイプコード: " . $node->nodeType . ")\n"; // 1:要素ノード (XML_ELEMENT_NODE)、3:テキストノード (XML_TEXT_NODE)、8:コメントノード (XML_COMMENT_NODE) など 63 64 // ノードタイプに応じて詳細情報を表示 65 switch ($node->nodeType) { 66 case XML_ELEMENT_NODE: // 要素ノードの場合 67 echo " タグ名: " . $node->tagName . "\n"; 68 // 要素のテキストコンテンツを短く表示 69 $text = trim($node->textContent); 70 echo " テキスト内容: " . (strlen($text) > 50 ? substr($text, 0, 47) . '...' : $text) . "\n"; 71 break; 72 case XML_TEXT_NODE: // テキストノードの場合 73 // テキストノードの値を短く表示 74 $value = trim($node->nodeValue); 75 if ($value !== '') { // 空のテキストノード(整形目的の改行など)はスキップ 76 echo " 値: " . (strlen($value) > 50 ? substr($value, 0, 47) . '...' : $value) . "\n"; 77 } else { 78 echo " 値: (空白のテキストノード)\n"; 79 } 80 break; 81 case XML_COMMENT_NODE: // コメントノードの場合 82 echo " コメント: " . $node->nodeValue . "\n"; 83 break; 84 // その他のノードタイプ(例:XML_DOCUMENT_TYPE_NODEなど)はここでは省略 85 default: 86 echo " その他の情報: nodeValue = " . $node->nodeValue . "\n"; 87 break; 88 } 89 echo "\n"; 90 } 91} 92 93// 関数を実行してサンプルコードの動作を確認 94displayBodyChildNodesExample(); 95
このサンプルコードは、PHPのDOM拡張機能におけるDOMNode::childNodesプロパティの基本的な使い方を示しています。このプロパティは、特定のDOMノード(例:HTML要素)が持つ直接の子ノード全てをリストとして取得するために使用されます。引数はなく、戻り値としてDOMNodeListオブジェクトを返します。DOMNodeListは、子ノードが順番に格納されたコレクションであり、foreachループなどで一つずつ取り出して処理できます。
コードではまず、HTML文字列をDOMDocumentオブジェクトにロードし、パースしています。次に、getElementsByTagNameメソッドを使ってHTMLドキュメントから<body>要素を取得します。取得した<body>要素のchildNodesプロパティにアクセスすることで、その直下に存在するすべての子ノードのリストがDOMNodeListとして得られます。このリストには、<h1>や<p>といった要素ノードだけでなく、要素間の改行や空白を含むテキストノード、さらにはコメントノードも含まれます。
サンプルコードは、取得したDOMNodeListをforeachループで反復処理し、各子ノードのノード名(nodeName)やノードタイプ(nodeType)、具体的な内容(textContentやnodeValue)を表示しています。これにより、HTML構造がどのようにDOMツリーとして表現され、childNodesプロパティを通じてどのようにアクセスできるかを確認できます。DOM操作の基本として非常に重要なステップであり、HTML文書の構造をプログラムで解析・操作する上で頻繁に利用されます。
DOMNode::childNodesプロパティは、HTMLの要素ノードの他に、整形による改行やインデントなどの空白テキストノード、コメントノードも含む全ての子ノードをDOMNodeListとして返します。そのため、意図しない空白テキストノードを処理しないよう、nodeTypeでフィルタリングしたり、nodeValueをtrim()で確認したりする工夫が必要です。このDOMNodeListはライブコレクションであり、元のDOMツリーの変更に連動して内容が自動的に更新されます。PHPのDOM拡張モジュールが必須であり、DOMDocument::loadHTML()利用時には、パースエラーの警告を抑制し、処理後にlibxml_clear_errors()でクリアするのが一般的です。