【PHP8.x】Dom\HTMLDocument::childNodesプロパティの使い方
childNodesプロパティの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
childNodesプロパティは、Dom\HTMLDocumentオブジェクトが持つ、そのドキュメントの直下の子ノードのリストを保持するプロパティです。具体的には、HTMLドキュメントの最上位レベルに存在する子ノードの集合を提供します。これには、通常、HTMLドキュメントのルート要素である<html>要素や、場合によってはドキュメントタイプ定義(DTD)を表すノードなどが含まれます。
このプロパティが返す値はDOMNodeList型のオブジェクトです。DOMNodeListは、順序付けられたノードのコレクションであり、各ノードにインデックス(添字)を用いてアクセスすることができます。重要な点として、このDOMNodeListは「ライブコレクション」として機能します。これは、一度取得された後でも、元のHTMLドキュメントの構造がプログラムによって変更されると、このリストの内容も自動的に、そしてリアルタイムに更新されることを意味します。
システムエンジニアを目指す初心者の方々にとって、このchildNodesプロパティは、Webページの内容をPHPで解析し、操作する上での出発点となります。例えば、Dom\HTMLDocumentオブジェクトからHTMLドキュメント全体の構造をたどり始めるために、まずこのプロパティを使ってドキュメントのルート要素を取得し、そこからさらに個々の要素を深く探索していくといった形で利用できます。ドキュメントの階層構造を理解し、プログラムでアクセスするための基礎となる非常に重要なプロパティです。
構文(syntax)
1<?php 2 3$document = new \Dom\HTMLDocument(); 4// HTMLコンテンツを読み込む例 5$document->loadHTML('<html><body><p>Example Content</p></body></html>'); 6 7$nodeList = $document->childNodes; 8 9?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
Dom\NodeList
Dom\HTMLDocument クラスの childNodes プロパティは、その要素の直下にあるすべてのノードを Dom\NodeList オブジェクトとして返します。このリストには、要素ノード、テキストノード、コメントノードなどが含まれます。
サンプルコード
PHP DOM childNodesで要素を取得する
1<?php 2 3declare(strict_types=1); 4 5/** 6 * Dom\HTMLDocument::childNodes プロパティの使用例を示します。 7 * 8 * HTMLドキュメントを読み込み、そのトップレベルにある子ノードの一覧を取得して、 9 * それぞれのノード名とノードタイプを表示します。 10 */ 11function demonstrateHtmlDocumentChildNodes(): void 12{ 13 // 解析対象のHTML文字列を定義します。 14 // DOCTYPE宣言、コメント、そしてルート要素である<html>が含まれています。 15 $html = <<<HTML 16<!DOCTYPE html> 17<!-- これはトップレベルのコメントノードです --> 18<html> 19<head> 20 <title>DOM ChildNodes Example</title> 21</head> 22<body> 23 <h1>Hello, World!</h1> 24 <p>This is a sample paragraph.</p> 25</body> 26</html> 27HTML; 28 29 // Dom\HTMLDocumentクラスのインスタンスを生成します。 30 $document = new Dom\HTMLDocument(); 31 32 // HTML文字列を読み込み、DOMツリーを構築します。 33 // HTML5の要素で警告が出るのを抑制するために@演算子を使用しています。 34 @$document->loadHTML($html); 35 36 // childNodesプロパティにアクセスし、ドキュメント直下の子ノードのリスト (Dom\NodeList) を取得します。 37 $childNodes = $document->childNodes; 38 39 echo "ドキュメントのトップレベルの子ノード一覧 (全" . $childNodes->length . "個):\n"; 40 echo "------------------------------------------------------------\n"; 41 42 // 取得したNodeListをループで反復処理します。 43 /** @var \Dom\Node $node */ 44 foreach ($childNodes as $node) { 45 // ノードのタイプ(整数値)を、人間が読みやすい文字列に変換します。 46 $nodeTypeString = match ($node->nodeType) { 47 XML_DOCUMENT_TYPE_NODE => 'DOCUMENT_TYPE_NODE (文書型宣言)', 48 XML_COMMENT_NODE => 'COMMENT_NODE (コメント)', 49 XML_ELEMENT_NODE => 'ELEMENT_NODE (要素)', 50 default => 'その他のノード', 51 }; 52 53 // 各ノードのノード名と、変換したノードタイプ文字列を出力します。 54 echo sprintf( 55 "%-25s | ノード名: %s\n", 56 "タイプ: " . $nodeTypeString, 57 "'" . $node->nodeName . "'" 58 ); 59 } 60} 61 62// 関数を実行します。 63demonstrateHtmlDocumentChildNodes();
Dom\HTMLDocument::childNodesは、HTMLドキュメントオブジェクトの直下にある全ての子ノードを取得するための読み取り専用プロパティです。このプロパティに引数はなく、戻り値としてノードの集合であるDom\NodeListオブジェクトを返します。ここでいう「子ノード」とは、<html>のような要素ノードだけでなく、<!DOCTYPE>で始まる文書型宣言やHTMLコメントなども含まれます。
このサンプルコードは、まずHTML文字列をloadHTML()メソッドで読み込み、DOMツリーを構築します。続いてchildNodesプロパティにアクセスし、ドキュメントの最上位階層にある全ての子ノードをDom\NodeListオブジェクトとして取得します。取得したDom\NodeListはforeach文で繰り返し処理が可能です。ループの中でリスト内の各ノードを一つずつ取り出し、それぞれのnodeType(ノードの種類)とnodeName(ノード名)プロパティの情報を整形して出力しています。これにより、ドキュメントを構成するトップレベルの要素がどのような種類と名前で構成されているかを確認できます。
childNodes プロパティは、<html> タグのような要素だけでなく、<!DOCTYPE> 宣言やコメントも「子ノード」として取得する点に注意が必要です。また、HTMLの記述によっては改行や空白だけのテキストノードが含まれる場合もあります。このプロパティが返すのはドキュメントのトップレベルにある直下の子ノードのみであり、入れ子になった要素の中身は含まれません。深い階層のノードにアクセスするには、取得した要素ノードに対してさらに childNodes を調べる必要があります。サンプルにある @loadHTML はHTML5の解釈で発生する警告を抑制しますが、他のエラーも見えなくなる可能性があるため、意図を理解して使用してください。
PHP DomDocument childNodes を取得する
1<?php 2 3declare(strict_types=1); 4 5/** 6 * Dom\HTMLDocumentのchildNodesプロパティの使用例を示します。 7 * HTML文字列を解析し、ドキュメント直下の子ノードを一覧表示します。 8 */ 9function displayDocumentChildNodes(): void 10{ 11 // 解析対象のHTML文字列を準備 12 $html = <<<HTML 13<!DOCTYPE html> 14<html> 15<head> 16 <title>childNodes Example</title> 17</head> 18<body> 19 <h1>Hello, DOM!</h1> 20</body> 21</html> 22HTML; 23 24 // Dom\HTMLDocumentのインスタンスを作成 25 $doc = new \Dom\HTMLDocument(); 26 27 // HTML文字列を読み込み、DOMツリーを構築 28 // 不正なHTMLの場合に警告が出ることがあるため、@で抑制します 29 @$doc->loadHTML($html); 30 31 // childNodesプロパティにアクセスし、ドキュメントの直下の子ノードを含む 32 // Dom\NodeListオブジェクトを取得します。 33 // 通常、<!DOCTYPE>ノードと<html>要素ノードが含まれます。 34 $childNodes = $doc->childNodes; 35 36 echo "ドキュメント直下の子ノード数: " . $childNodes->length . "\n"; 37 echo "--------------------------\n"; 38 39 // 取得したNodeListをループ処理で一つずつ取り出す 40 foreach ($childNodes as $index => $node) { 41 // ノードの種類を判定し、分かりやすい文字列に変換 (PHP 8のmatch式を使用) 42 $nodeTypeString = match ($node->nodeType) { 43 XML_DOCUMENT_TYPE_NODE => '文書型宣言ノード (DocumentType)', 44 XML_ELEMENT_NODE => '要素ノード (Element)', 45 default => 'その他のノード', 46 }; 47 48 // 各ノードの情報を出力 49 printf( 50 "[%d] nodeName: %s, nodeType: %s\n", 51 $index, 52 $node->nodeName, // ノード名 (例: "html") 53 $nodeTypeString // ノードの種類 54 ); 55 } 56} 57 58// 関数を実行して結果を表示 59displayDocumentChildNodes(); 60
Dom\HTMLDocumentクラスのchildNodesプロパティは、HTMLドキュメントの直下にあるすべての子ノードを取得するために使用します。このプロパティには引数はなく、アクセスすると戻り値としてDom\NodeListオブジェクトが返されます。Dom\NodeListは、取得したノードの集合を格納する特別なオブジェクトです。
サンプルコードでは、まずHTML文字列をloadHTMLメソッドで読み込み、DOMツリーと呼ばれる階層構造をメモリ上に構築します。次に、$doc->childNodesのようにプロパティへアクセスし、ドキュメントの直接の子であるノードのリストを取得しています。このHTMLの場合、ドキュメントの直下には<!DOCTYPE html>という文書型宣言ノードと、<html>という要素ノードの2つが存在するため、これらがDom\NodeListに含まれます。
取得したDom\NodeListオブジェクトは、foreach文を使って配列のようにループ処理ができます。ループの中で各ノード($node)を取り出し、nodeNameプロパティでノード名(例: "html")、nodeTypeプロパティでノードの種類を調べて表示しています。このようにchildNodesプロパティは、HTMLドキュメントの最上位レベルの要素にアクセスする際の出発点となります。
childNodesプロパティは、HTMLドキュメントの直下にある子ノードの一覧を取得します。サンプルコードの<h1>要素のような、さらに深い階層の要素は含まれない点に注意してください。取得されるノードには、要素だけでなく文書型宣言やコメント、そしてHTMLソース内の改行や空白文字がテキストノードとして含まれることがあります。意図しないノードが含まれていないか確認すると良いでしょう。また、loadHTML関数で使われている@は、不正なHTMLを読み込んだ際の警告を抑制しますが、開発中は原因特定のために警告を表示させた方が安全です。このコードの実行には、PHPにDOM拡張モジュールがインストールされている必要があります。