Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】Dom\HTMLDocument::nodeTypeプロパティの使い方

nodeTypeプロパティの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

Dom\HTMLDocumentクラスのnodeTypeプロパティは、ノードの型を表す整数値を保持するプロパティです。このプロパティは、DOM (Document Object Model) におけるノードの種類を識別するために使用されます。具体的には、定数として定義されているノード型を表す値が格納されます。

例えば、HTMLドキュメントを表すノードの場合、XML_HTML_DOCUMENT_NODEという定数に対応する値が格納されます。同様に、要素ノード(例えば <p> タグなど)であれば XML_ELEMENT_NODE、テキストノードであれば XML_TEXT_NODEといった定数に対応する値が格納されます。

システムエンジニアを目指す初心者にとって、nodeTypeプロパティは、DOMツリーを操作する際に、各ノードがどのような種類のノードであるかをプログラム上で判断するために非常に重要です。ノードの種類に応じて異なる処理を行う必要がある場合に、このプロパティの値を確認することで、適切な処理を選択することができます。

このプロパティは読み取り専用であり、直接値を変更することはできません。ノードの型は、ノードが生成された時点で決定され、その後変更されることはありません。nodeTypeプロパティの値を確認することで、プログラムは柔軟にDOMツリーを処理し、様々な操作を効率的に行うことができます。nodeTypeプロパティの値と対応する定数については、PHPの公式ドキュメントやDOMに関するリファレンスを参照することで、より詳細な情報を得ることができます。

構文(syntax)

1Dom\HTMLDocument::$nodeType;

引数(parameters)

引数なし

引数はありません

戻り値(return)

int

このプロパティは、ノードの種類を表す整数値を返します。例えば、要素ノードの場合は1、属性ノードの場合は2となります。

サンプルコード

PHP DOMDocument nodeType を取得する

1<?php
2
3/**
4 * Dom\HTMLDocument クラスの nodeType プロパティの使用方法を示すサンプルコード。
5 *
6 * nodeType プロパティは、DOM ノードの種類を示す整数値を返します。
7 * Dom\HTMLDocument オブジェクト自体は DOM_DOCUMENT_NODE (9) を返します。
8 */
9function demonstrateHtmlDocumentNodeType(): void
10{
11    // Dom\HTMLDocument のインスタンスを作成します。
12    // これは、HTML ドキュメントをプログラムで操作するためのオブジェクトです。
13    $document = new Dom\HTMLDocument();
14
15    // 簡単な HTML コンテンツをドキュメントに読み込みます。
16    // loadHTML メソッドは、指定された HTML 文字列を解析し、DOM ツリーを構築します。
17    $htmlContent = '<!DOCTYPE html><html><body><h1>Hello, World!</h1></body></html>';
18    $document->loadHTML($htmlContent);
19
20    // Dom\HTMLDocument オブジェクト自体の nodeType を取得し、表示します。
21    // Dom\HTMLDocument (および Dom\Document) オブジェクトの nodeType は
22    // 常に DOM_DOCUMENT_NODE (整数値 9) です。
23    $documentNodeType = $document->nodeType;
24    echo "Dom\\HTMLDocument オブジェクトの nodeType: " . $documentNodeType . " (定数: DOM_DOCUMENT_NODE)\n";
25
26    // 参考として、ドキュメント内の他のノードの nodeType も見てみましょう。
27    // 例: 最初の H1 要素を取得します。
28    $h1Element = $document->getElementsByTagName('h1')->item(0);
29
30    if ($h1Element) {
31        // H1 要素の nodeType を取得し、表示します。
32        // 要素ノード (例: <h1>, <p>, <div> など) の nodeType は
33        // DOM_ELEMENT_NODE (整数値 1) です。
34        $h1NodeType = $h1Element->nodeType;
35        echo "H1 要素ノードの nodeType: " . $h1NodeType . " (定数: DOM_ELEMENT_NODE)\n";
36
37        // H1 要素内のテキストノードを取得します。
38        $h1TextNode = $h1Element->firstChild;
39        if ($h1TextNode && $h1TextNode->nodeType === DOM_TEXT_NODE) {
40            // テキストノードの nodeType を取得し、表示します。
41            // テキストノード (要素内の純粋な文字列) の nodeType は
42            // DOM_TEXT_NODE (整数値 3) です。
43            $h1TextNodeType = $h1TextNode->nodeType;
44            echo "H1 内のテキストノードの nodeType: " . $h1TextNodeType . " (定数: DOM_TEXT_NODE)\n";
45        }
46    }
47}
48
49// 関数を実行して、サンプルコードの動作を確認します。
50demonstrateHtmlDocumentNodeType();

PHP 8のDom\HTMLDocumentクラスに属するnodeTypeプロパティは、DOMツリー内の各ノードがどのような種類であるかを識別するための整数値を返します。このプロパティは引数を取らず、int型の整数値を戻り値として提供します。Dom\HTMLDocumentオブジェクト自体は、HTMLドキュメント全体を表すルートノードであり、そのnodeTypeは常にDOM_DOCUMENT_NODE(整数値9)です。

サンプルコードでは、まずDom\HTMLDocumentのインスタンスを生成し、HTMLコンテンツを読み込みます。そして、このドキュメントオブジェクトのnodeTypeが9であることを確認します。さらに、ドキュメント内の特定の見出し要素(<h1>)を取得し、そのnodeTypeが要素ノードを示すDOM_ELEMENT_NODE(整数値1)であること、また、その要素内のテキストコンテンツがテキストノードを示すDOM_TEXT_NODE(整数値3)であることを示しています。nodeTypeを利用することで、プログラムは操作しているノードの種類を正確に判別し、それに合わせた処理を記述できるようになります。

nodeTypeはDOMノードの種類を示す整数値ですが、コードの可読性を高めるため、DOM_DOCUMENT_NODEのような対応する定数を使用することをお勧めします。Dom\HTMLDocumentオブジェクト自体のnodeTypeは常にDOM_DOCUMENT_NODE (9)を返しますが、他の要素ノードやテキストノードはそれぞれ異なる値を持ちます。DOM要素を取得する際は、対象が存在しない可能性があるため、必ずnullチェックを行い、予期せぬエラーを防ぐようにしてください。また、loadHTMLメソッドでHTMLを読み込む際、不正なHTMLがあると警告が発生する場合がありますので、本番環境での利用ではエラーハンドリングも考慮するとより堅牢なコードになります。

PHP DOM: nodeType でノード種別を取得する

1<?php
2
3/**
4 * Dom\HTMLDocument クラスの nodeType プロパティの使用方法をデモンストレーションします。
5 *
6 * nodeType プロパティは、DOMノードの種類を数値で表すために使用されます。
7 * Dom\HTMLDocument オブジェクト自体は、HTMLドキュメント全体を表すため、
8 * 常に「ドキュメントノード」のタイプを持ちます。
9 * この関数では、Dom\HTMLDocument オブジェクトの nodeType と、
10 * ドキュメント内の一般的なノード(要素、テキスト、コメント)の nodeType を示します。
11 */
12function demonstrateHtmlDocumentNodeType(): void
13{
14    // Dom\HTMLDocument の新しいインスタンスを作成します。
15    // これはHTMLドキュメント全体を表現するオブジェクトです。
16    $document = new Dom\HTMLDocument();
17
18    // ロードする簡単なHTML文字列を定義します。
19    $htmlContent = <<<HTML
20<!DOCTYPE html>
21<html>
22<head>
23    <title>サンプルページ</title>
24</head>
25<body>
26    <h1>こんにちは、DOMの世界!</h1>
27    <p>これは<strong>段落</strong>のテキストです。</p>
28    <!-- これはHTMLコメントです -->
29</body>
30</html>
31HTML;
32
33    // HTML文字列をドキュメントオブジェクトにロードし、DOMツリーを構築します。
34    $document->loadHTML($htmlContent);
35
36    echo "--- Dom\\HTMLDocument オブジェクト自体の nodeType ---\n";
37    // Dom\HTMLDocument オブジェクト自体の nodeType は、常にドキュメントノードを示します。
38    // PHPのDOM拡張機能では、XML_DOCUMENT_NODE 定数で表されます。
39    echo "document->nodeType: " . $document->nodeType . "\n";
40    echo "  (XML_DOCUMENT_NODE = " . XML_DOCUMENT_NODE . ": ドキュメント全体を表すノード)\n\n";
41
42
43    echo "--- ドキュメント内の一般的なノードの nodeType の例 ---\n";
44
45    // 1. HTML要素ノードの nodeType の例
46    // ドキュメントのルート要素 (<html>) を取得します。
47    $htmlElement = $document->documentElement;
48    if ($htmlElement) {
49        echo "<html>要素の nodeType: " . $htmlElement->nodeType . "\n";
50        echo "  (XML_ELEMENT_NODE = " . XML_ELEMENT_NODE . ": HTMLタグのような要素ノード)\n\n";
51    }
52
53    // <body>要素を取得します。
54    $bodyElement = $document->body;
55    if ($bodyElement) {
56        echo "<body>要素の nodeType: " . $bodyElement->nodeType . "\n";
57        echo "  (XML_ELEMENT_NODE = " . XML_ELEMENT_NODE . ": HTMLタグのような要素ノード)\n\n";
58    }
59
60    // 2. テキストノードの nodeType の例
61    // <h1>要素を取得し、その最初の子ノードがテキストノードであることを確認します。
62    $h1Element = $document->getElementsByTagName('h1')->item(0);
63    if ($h1Element && $h1Element->firstChild) {
64        echo "<h1>要素内のテキストノードの nodeType: " . $h1Element->firstChild->nodeType . "\n";
65        echo "  (XML_TEXT_NODE = " . XML_TEXT_NODE . ": 要素の内容であるテキストノード)\n\n";
66    }
67
68    // 3. コメントノードの nodeType の例
69    // XPath を使用してドキュメント内のコメントノードを検索します。
70    $xpath = new Dom\XPath($document);
71    $commentNodes = $xpath->query('//comment()');
72    if ($commentNodes->length > 0) {
73        $commentNode = $commentNodes->item(0);
74        echo "コメントノードの nodeType: " . $commentNode->nodeType . "\n";
75        echo "  (XML_COMMENT_NODE = " . XML_COMMENT_NODE . ": HTMLコメントノード)\n\n";
76    }
77}
78
79// 関数を実行してデモンストレーションを開始します。
80demonstrateHtmlDocumentNodeType();

PHPのDom\HTMLDocumentクラスのnodeTypeプロパティは、DOM(Document Object Model)ノードの種類を数値で取得するために使用されます。このプロパティは引数を持たず、ノードの種類を示す整数値(int)を返します。

サンプルコードでは、まずDom\HTMLDocumentオブジェクトを生成し、HTMLコンテンツをロードしています。Dom\HTMLDocumentオブジェクト自体はHTMLドキュメント全体を表すため、そのnodeTypeは常に9となり、これはXML_DOCUMENT_NODE定数で定義される「ドキュメントノード」を意味します。

さらにサンプルコードは、ロードされたドキュメント内の異なる種類のノードのnodeTypeも示しています。例えば、<html><body>のようなHTMLタグはXML_ELEMENT_NODE(値は1)として、<h1>要素内のテキストはXML_TEXT_NODE(値は3)として、HTMLコメントはXML_COMMENT_NODE(値は8)として識別されます。

このようにnodeTypeプロパティを使用することで、PHPでDOMを操作する際に、現在のノードがどのような種類のノードであるかを正確に判別し、それに応じた適切な処理を行うことが可能になります。これは、特定の種類のノードだけを抽出したり、内容を編集したりする場合に非常に役立ちます。

Dom\HTMLDocumentオブジェクトのnodeTypeプロパティは、そのオブジェクトがHTMLドキュメント全体を表すノードであることを示し、常にXML_DOCUMENT_NODE(値9)を返します。一方で、ドキュメント内のHTML要素、テキスト、コメントといった個々のノードは、それぞれ異なるnodeTypeを持ちます。例えば、HTML要素はXML_ELEMENT_NODE(値1)、テキストはXML_TEXT_NODE(値3)を返します。ノードの種類を判別する際は、これらの数値リテラルを直接使用するのではなく、PHPに定義されているXML_ELEMENT_NODEのような定数と比較することで、コードの可読性と保守性を高めることができます。また、コード中で目的のノードにアクセスする際は、事前にそのノードが実際に存在するかを必ず確認するようにしてください。存在しないノードにアクセスしようとすると、エラーが発生する原因となります。

XMLReader で nodeType を判別する

1<?php
2
3declare(strict_types=1);
4
5/**
6 * XMLReaderを使用してXMLデータを解析し、各ノードのタイプを表示します。
7 *
8 * nodeTypeプロパティは、現在カーソルがあるノードの種類を整数で返します。
9 * このサンプルでは、switch文とXMLReaderの定数を使って、ノードタイプを判別しています。
10 *
11 * @param string $xmlString 解析対象のXML文字列
12 * @return void
13 */
14function analyzeXmlNodeTypes(string $xmlString): void
15{
16    // XMLReaderのインスタンスを生成
17    $reader = new XMLReader();
18
19    // 文字列からXMLを読み込む
20    if (!$reader->XML($xmlString)) {
21        // XMLのパースに失敗した場合
22        echo "XMLの読み込みに失敗しました。" . PHP_EOL;
23        return;
24    }
25
26    // read()メソッドでXMLのノードを順番に読み進める
27    while ($reader->read()) {
28        // nodeTypeプロパティで現在のノードの種類を判定
29        switch ($reader->nodeType) {
30            // 要素ノード (例: <user>)
31            case XMLReader::ELEMENT:
32                // nameプロパティで要素名を取得
33                echo "ノードタイプ: 要素 (" . $reader->nodeType . "), 名前: " . $reader->name . PHP_EOL;
34                break;
35
36            // テキストノード (例: "Taro")
37            case XMLReader::TEXT:
38                // valueプロパティでテキスト内容を取得(空白文字はトリム)
39                $value = trim($reader->value);
40                if (!empty($value)) {
41                    echo "ノードタイプ: テキスト (" . $reader->nodeType . "), 内容: " . $value . PHP_EOL;
42                }
43                break;
44
45            // コメントノード (例: <!-- comment -->)
46            case XMLReader::COMMENT:
47                echo "ノードタイプ: コメント (" . $reader->nodeType . "), 内容: " . $reader->value . PHP_EOL;
48                break;
49
50            // 終了要素ノード (例: </user>)
51            case XMLReader::END_ELEMENT:
52                echo "ノードタイプ: 終了要素 (" . $reader->nodeType . "), 名前: " . $reader->name . PHP_EOL;
53                break;
54        }
55    }
56
57    // リソースを解放
58    $reader->close();
59}
60
61// サンプルとして使用するXML文字列
62$xml = <<<XML
63<?xml version="1.0" encoding="UTF-8"?>
64<!-- ユーザーデータのリスト -->
65<users>
66  <user id="1">
67    <name>Taro Yamada</name>
68  </user>
69</users>
70XML;
71
72// 関数を実行して結果を表示
73analyzeXmlNodeTypes($xml);
74
75?>

このサンプルコードは、PHPのXMLReader拡張機能を用いてXMLデータを解析し、各ノードのタイプを表示する方法を示しています。XMLReader::nodeTypeプロパティは、現在カーソルが位置するXMLノードの種類を整数値で返します。このプロパティは引数を取らず、XMLの構造をプログラムで理解し、ノードの種類に応じて異なる処理を行う際に非常に有用です。

コードではまずXMLReaderオブジェクトを生成し、XML()メソッドで解析対象のXML文字列を読み込みます。次に、while ($reader->read())ループを使ってXMLドキュメント内のノードを一つずつ順に読み進めます。ループの内部では、$reader->nodeTypeプロパティの値を利用し、switch文とXMLReaderクラスが提供する定数(例えばXMLReader::ELEMENTで要素ノード、XMLReader::TEXTでテキストノードなど)を使って、現在のノードがどのタイプであるかを正確に判別しています。ノードのタイプに応じて、$reader->nameプロパティから要素名を取得したり、$reader->valueプロパティからテキスト内容やコメントを取得し、その情報をコンソールに表示しています。これにより、XMLの複雑な構造を段階的に読み解き、必要なデータだけを抽出する処理を効率的に実装することができます。

XMLReaderを使う際の注意点です。$reader->nodeTypeはノードの種類を整数で返します。XMLReader::ELEMENTなどの定数と比較することで、ノードの種類を判別できます。テキストノード(XMLReader::TEXT)の$reader->valueには空白文字が含まれることがあるため、trim()で除去すると良いでしょう。XMLReaderはリソースを消費するため、処理が終わったら$reader->close()で必ず閉じてください。XMLの構造によっては意図しないノードタイプを読み込む場合があるので、エラー処理を追加するとより安全です。例えば、予期しないノードタイプに遭遇した場合の処理を追加できます。

関連コンテンツ

関連プログラミング言語