【PHP8.x】nodeTypeプロパティの使い方

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

作成日: 更新日:

基本的な使い方

nodeTypeプロパティは、DOM (Document Object Model) におけるノードの種類を識別するための整数値を保持するプロパティです。PHPのDom\Documentクラスは、XMLやHTMLなどのマークアップ言語で記述された文書全体を表現するオブジェクトです。

このDom\DocumentオブジェクトのnodeTypeプロパティは、常に文書全体を表す「文書ノード」であることを示す特定の値(例えば、XML_DOCUMENT_NODE定数で表される値)を返します。これは、Dom\Documentオブジェクトが文書構造の最上位、つまり文書そのものを表すためです。

システムエンジニアを目指す方にとって、このnodeTypeプロパティは、DOMツリーをプログラムで走査し、各ノードの種類を判別する上で重要な手段です。Dom\Documentオブジェクトでは、このプロパティで文書全体のルートノードであることを確認できます。DOM操作においてノードの種類に応じた処理を行う際、nodeTypeは基本的な判別基準として活用されます。

構文(syntax)

1<?php
2
3$document = new \Dom\Document();
4
5// プロパティの値を取得します
6$type = $document->nodeType;
7
8var_dump($type);
9
10?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

DOMNode::nodeType を参照して判断します。

<?php

$dom = new DomDocument;
echo $dom->nodeType;

?>

上記コードを実行すると数値が出力されることから、戻り値は 戻り値なし ではありません。

<?php

libxml_use_internal_errors(true);

$dom = new DomDocument();
$dom->loadHTML('<!DOCTYPE html><html><body><h1>My First Heading</h1><p>My first paragraph.</p></body></html>');

$node = $dom->documentElement;

echo $node->nodeType . PHP_EOL; // Outputs: 1
echo $dom->nodeType . PHP_EOL; // Outputs: 9
echo $dom->firstChild->nodeType . PHP_EOL; // Outputs: 7

nodeType は定数値を返します。

int

Dom\Document クラスの nodeType プロパティは、ノードの種類を表す整数値を返します。この整数値は、DOMNode::nodeType で定義されている定数に対応しており、例えばドキュメントノードの場合は 9、要素ノードの場合は 1、処理命令ノードの場合は 7 となります。

サンプルコード

PHP DomDocument nodeType を取得する

1<?php
2
3declare(strict_types=1);
4
5/**
6 * DOMDocumentと、それに含まれる各ノードのnodeTypeプロパティの値を確認します。
7 *
8 * nodeTypeは、そのノードがどの種類(ドキュメント、要素、テキストなど)であるかを示す整数値を返します。
9 * PHPでは、これらの数値に対応するXML_*という形式の定義済み定数が用意されています。
10 */
11function showNodeTypeExample(): void
12{
13    // 解析するHTML文字列を定義します。
14    $html = <<<HTML
15<!DOCTYPE html>
16<!-- ページのコメント -->
17<html>
18<body>
19    <h1>見出し</h1>
20</body>
21</html>
22HTML;
23
24    // DOMDocumentオブジェクトをインスタンス化します。
25    $dom = new DOMDocument();
26
27    // HTML5の解釈エラーを抑制し、HTML文字列を読み込みます。
28    libxml_use_internal_errors(true);
29    $dom->loadHTML($html);
30    libxml_clear_errors();
31
32    // 1. DOMDocumentオブジェクト自身のnodeType (ドキュメントノード)
33    // ドキュメント全体を表し、常に 9 (XML_DOCUMENT_NODE) となります。
34    echo "DOMDocument       : " . $dom->nodeType . PHP_EOL;
35
36    // 2. DOCTYPE宣言のnodeType (ドキュメント型ノード)
37    // $dom->doctype プロパティから取得します。nodeTypeは 10 (XML_DOCUMENT_TYPE_NODE) です。
38    echo "<!DOCTYPE>        : " . $dom->doctype->nodeType . PHP_EOL;
39
40    // 3. <html>要素のnodeType (要素ノード)
41    // $dom->documentElement プロパティはルート要素を指します。nodeTypeは 1 (XML_ELEMENT_NODE) です。
42    echo "<html> Element      : " . $dom->documentElement->nodeType . PHP_EOL;
43    
44    // 4. コメントのnodeType (コメントノード)
45    // <html>要素内の最初の子ノードであるコメントを取得します。nodeTypeは 8 (XML_COMMENT_NODE) です。
46    $comment = $dom->documentElement->firstChild;
47    echo "Comment           : " . $comment->nodeType . PHP_EOL;
48
49    // 5. テキストのnodeType (テキストノード)
50    // <h1>要素を取得し、その中にあるテキストノードのnodeTypeを取得します。nodeTypeは 3 (XML_TEXT_NODE) です。
51    $h1 = $dom->getElementsByTagName('h1')->item(0);
52    echo "<h1> Text         : " . $h1->firstChild->nodeType . PHP_EOL;
53}
54
55// 関数を呼び出してサンプルを実行します。
56showNodeTypeExample();
57

Dom\DocumentクラスのnodeTypeプロパティは、DOMツリー内のノードがどの種類に属するかを識別するための整数値を返します。このプロパティに引数はなく、アクセスするだけで値を取得できます。

戻り値はノードの種類を示す整数です。例えば、ドキュメント全体を表すノードは9、HTMLタグのような要素ノードは1、文章などのテキストノードは3、コメントノードは8といった値が返されます。これらの数値は、PHPで定義されているXML_DOCUMENT_NODEXML_ELEMENT_NODEといった定数に対応しており、コードの可読性を高めるために定数を利用することが推奨されます。

サンプルコードでは、まずHTML文字列を読み込んでDOMDocumentオブジェクトを生成しています。そして、オブジェクト自身や、そこに含まれるDOCTYPE宣言、<html>要素、コメント、<h1>タグ内のテキストといった様々なノードにアクセスし、それぞれのnodeTypeプロパティの値を出力しています。実行結果から、ドキュメント全体は9<html>要素は1、DOCTYPE宣言は10、コメントは8、テキストは3となり、ノードの種類に応じて異なる整数値が返されることが確認できます。このようにnodeTypeプロパティを利用することで、DOMツリー内の特定の種類のノードを判別して処理を分岐させることが可能になります。

nodeTypeプロパティは、DOMツリー内の各ノードがどのような種類(要素、テキスト、コメントなど)であるかを示す整数値を返します。DOMDocumentオブジェクト自身のnodeTypeは常に9(ドキュメントノード)ですが、その子ノードや孫ノード(要素、テキストなど)のnodeTypeはそれぞれ異なる値になりますので注意が必要です。例えば要素ノードは1、テキストノードは3、コメントノードは8を返します。これらの数値はPHPで定義されているXML_ELEMENT_NODEのような定数と比較すると、コードの可読性が向上します。HTMLを解析する際は、libxml_use_internal_errors(true)libxml_clear_errors()を使用し、パースエラーによる不要な警告を抑制すると、より安全に処理を進められます。

関連コンテンツ

関連プログラミング言語