【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>といった要素ノードだけでなく、要素間の改行や空白を含むテキストノード、さらにはコメントノードも含まれます。

サンプルコードは、取得したDOMNodeListforeachループで反復処理し、各子ノードのノード名(nodeName)やノードタイプ(nodeType)、具体的な内容(textContentnodeValue)を表示しています。これにより、HTML構造がどのようにDOMツリーとして表現され、childNodesプロパティを通じてどのようにアクセスできるかを確認できます。DOM操作の基本として非常に重要なステップであり、HTML文書の構造をプログラムで解析・操作する上で頻繁に利用されます。

DOMNode::childNodesプロパティは、HTMLの要素ノードの他に、整形による改行やインデントなどの空白テキストノード、コメントノードも含む全ての子ノードをDOMNodeListとして返します。そのため、意図しない空白テキストノードを処理しないよう、nodeTypeでフィルタリングしたり、nodeValuetrim()で確認したりする工夫が必要です。このDOMNodeListはライブコレクションであり、元のDOMツリーの変更に連動して内容が自動的に更新されます。PHPのDOM拡張モジュールが必須であり、DOMDocument::loadHTML()利用時には、パースエラーの警告を抑制し、処理後にlibxml_clear_errors()でクリアするのが一般的です。

関連コンテンツ

関連プログラミング言語