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

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

作成日: 更新日:

基本的な使い方

nodeTypeプロパティは、DOMNodeオブジェクトが表すDOMツリー内のノードの種類を識別するための整数値を保持するプロパティです。

DOM(Document Object Model)は、HTMLやXMLドキュメントの構造を表現し、プログラムからその内容や構造にアクセス・操作するためのAPIです。DOMツリーでは、ドキュメントの各構成要素(要素、属性、テキスト、コメントなど)が「ノード」として表現されます。このnodeTypeプロパティは、特定のDOMNodeインスタンスが、これら多数のノードタイプのうちどれに該当するかを示す数値を提供します。

システムエンジニアを目指す方にとって、このプロパティはDOMツリーを走査し、ノードの種類に応じて処理を分岐させる際に非常に重要です。例えば、特定の要素ノードだけを対象に処理を行いたい場合や、テキストノードの内容を抽出したい場合などに、nodeTypeの値を確認することで適切なロジックを適用できます。

返される値は、PHPのDOM拡張機能によって定義されている定数(例えば、要素ノードを表すXML_ELEMENT_NODE、テキストノードを表すXML_TEXT_NODE、コメントノードを表すXML_COMMENT_NODEなど)と対応しています。これらの定数を使用することで、可読性の高いコードでノードの種類を判別することが可能です。

このプロパティは、PHP 8で提供されるDOM拡張機能の一部であり、DOMDocumentやDOMElementを含むDOMNodeのすべてのサブクラスで利用できます。これにより、どのような種類のノードであっても、共通の手段でその種類を判別し、柔軟なドキュメント処理を実現できます。

構文(syntax)

1<?php
2$dom = new DOMDocument();
3$element = $dom->createElement('example');
4$type = $element->nodeType;
5?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

int

DOMNodeのnodeTypeプロパティは、ノードの種類を示す整数値を返します。この整数値は、DOMNode::ELEMENT_NODE(要素ノード)やDOMNode::TEXT_NODE(テキストノード)などの定数で定義されています。

サンプルコード

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

1<?php
2
3/**
4 * DOMNode::nodeType プロパティの使用方法をデモンストレーションします。
5 *
6 * この関数は、様々なDOMノードを作成し、それぞれの nodeType プロパティの
7 * 整数値と、対応する定数名を分かりやすく表示します。
8 * nodeType は、ノードがどの種類のノードであるか(要素、テキスト、コメントなど)
9 * を示す整数値を返します。
10 */
11function demonstrateDomNodeType(): void
12{
13    // 1. 新しいDOMドキュメントを作成します。
14    // DOMDocument自体もDOMNodeの一種であり、nodeTypeを持ちます。
15    $dom = new DOMDocument('1.0', 'UTF-8');
16    // 出力時に整形を有効にします(このデモでは直接関係ありませんが、慣習として)。
17    $dom->formatOutput = true;
18
19    // 2. 様々なDOMノードを作成し、ドキュメントに追加します。
20
21    // ルート要素を作成
22    $rootElement = $dom->createElement('root');
23    $dom->appendChild($rootElement);
24
25    // 要素ノードを作成
26    $element = $dom->createElement('greeting', 'Hello, DOM World!');
27    // 属性ノードを要素に追加
28    $element->setAttribute('lang', 'en');
29    $rootElement->appendChild($element);
30
31    // テキストノードを取得 (上記要素の子ノードとして自動的に作成されます)
32    // $element の子ノードが一つだけなので、firstChild で取得できます。
33    $textNode = $element->firstChild;
34
35    // コメントノードを作成
36    $comment = $dom->createComment('これはDOMツリー内のコメントです');
37    $rootElement->appendChild($comment);
38
39    // 3. nodeType プロパティをデモンストレーションします。
40    echo "--- DOMNode::nodeType デモンストレーション ---\n\n";
41
42    // nodeType の整数値を人間が読める定数名に変換するヘルパー関数 (クロージャ)
43    // PHP 8 の `match` 式を使用しています。
44    $getNodeTypeName = static function (int $nodeType): string {
45        return match ($nodeType) {
46            XML_ELEMENT_NODE => 'XML_ELEMENT_NODE (1)',        // 要素ノード (例: <div>)
47            XML_ATTRIBUTE_NODE => 'XML_ATTRIBUTE_NODE (2)',    // 属性ノード (例: id="...")
48            XML_TEXT_NODE => 'XML_TEXT_NODE (3)',              // テキストノード (例: Hello!)
49            XML_CDATA_SECTION_NODE => 'XML_CDATA_SECTION_NODE (4)',
50            XML_ENTITY_REF_NODE => 'XML_ENTITY_REF_NODE (5)',
51            XML_ENTITY_NODE => 'XML_ENTITY_NODE (6)',
52            XML_PI_NODE => 'XML_PI_NODE (7)',                  // 処理命令ノード
53            XML_COMMENT_NODE => 'XML_COMMENT_NODE (8)',        // コメントノード (例: <!-- ... -->)
54            XML_DOCUMENT_NODE => 'XML_DOCUMENT_NODE (9)',      // ドキュメントノード (DOMDocument自体)
55            XML_DOCUMENT_TYPE_NODE => 'XML_DOCUMENT_TYPE_NODE (10)',
56            XML_DOCUMENT_FRAG_NODE => 'XML_DOCUMENT_FRAG_NODE (11)',
57            XML_NOTATION_NODE => 'XML_NOTATION_NODE (12)',
58            default => "UNKNOWN_NODE ($nodeType)",
59        };
60    };
61
62    // DOMDocument (ドキュメントノード) の nodeType を表示
63    echo "ノード: \$dom (DOMDocument)\n";
64    echo "  Type (int): " . $dom->nodeType . "\n";
65    echo "  Type (定数): " . $getNodeTypeName($dom->nodeType) . "\n\n";
66
67    // DOMElement (要素ノード 'greeting') の nodeType を表示
68    echo "ノード: \$element (DOMElement 'greeting')\n";
69    echo "  Type (int): " . $element->nodeType . "\n";
70    echo "  Type (定数): " . $getNodeTypeName($element->nodeType) . "\n\n";
71
72    // DOMText (テキストノード 'Hello, DOM World!') の nodeType を表示
73    // $textNode が確実に DOMText インスタンスであることを確認
74    if ($textNode instanceof DOMText) {
75        echo "ノード: \$textNode (DOMText '" . $textNode->nodeContent . "')\n";
76        echo "  Type (int): " . $textNode->nodeType . "\n";
77        echo "  Type (定数): " . $getNodeTypeName($textNode->nodeType) . "\n\n";
78    }
79
80    // DOMAttr (属性ノード 'lang') の nodeType を表示
81    // 属性ノードは要素の `attributes` プロパティから取得します。
82    $attr = $element->attributes->getNamedItem('lang');
83    // $attr が確実に DOMAttr インスタンスであることを確認
84    if ($attr instanceof DOMAttr) {
85        echo "ノード: \$attr (DOMAttr '" . $attr->name . "=\"" . $attr->value . "\"')\n";
86        echo "  Type (int): " . $attr->nodeType . "\n";
87        echo "  Type (定数): " . $getNodeTypeName($attr->nodeType) . "\n\n";
88    }
89
90    // DOMComment (コメントノード) の nodeType を表示
91    echo "ノード: \$comment (DOMComment)\n";
92    echo "  Type (int): " . $comment->nodeType . "\n";
93    echo "  Type (定数): " . $getNodeTypeName($comment->nodeType) . "\n\n";
94}
95
96// デモンストレーション関数を実行します。
97demonstrateDomNodeType();

PHPのDOMNode::nodeTypeプロパティは、DOMツリー内の各ノードがどの種類であるかを判別するために使用されます。このプロパティは引数を持たず、ノードの種類を表す整数値を返します。DOM(Document Object Model)は、HTMLやXML文書をオブジェクトとして表現し、プログラムから操作できるようにするもので、文書内のあらゆる部分が「ノード」として扱われます。

サンプルコードでは、DOMDocumentを生成し、要素ノード(例: <greeting>), テキストノード(例: Hello, DOM World!), コメントノード(例: <!-- ... -->), 属性ノード(例: lang="en") といった様々な種類のノードを作成しています。そして、それぞれのノードについてnodeTypeプロパティにアクセスし、その整数値と、PHPが定義している対応する定数名(XML_ELEMENT_NODEXML_TEXT_NODEなど)を表示しています。例えば、要素ノードでは1が、テキストノードでは3が返されます。

このプロパティを活用することで、DOMツリーを走査しながら特定の種類のノードだけを選別して処理したり、ノードの種類に応じて異なるロジックを適用したりすることが可能になります。システムエンジニアを目指す初心者の方にとって、DOM操作におけるノードの種類を理解し、適切に判別するための基本的なツールとなります。

DOMNode::nodeTypeプロパティは、HTMLやXMLなどのDOMツリーを扱う際、各ノードが要素、テキスト、コメントなど、どの種類であるかを識別する整数値を返します。この整数値は、XML_ELEMENT_NODEXML_TEXT_NODEといったPHPの定義済み定数と比較してノードの種類を特定するのが一般的です。例えば、<p>タグは要素ノード、その中の文章はテキストノードとなります。属性ノードは要素のattributesプロパティから取得する必要があります。DOMDocumentオブジェクト自体もDOMNodeの一種であり、XML_DOCUMENT_NODEの型を持ちます。サンプルコードにあるように、instanceofでノードの型を事前に確認することは、処理を安全に進める上で重要です。PHP 8以降では、match式を用いて複数の条件分岐を簡潔に記述できます。

PHP: XMLReaderとDOMNode::nodeTypeでノードタイプを解析する

1<?php
2
3/**
4 * 指定されたXML文字列を読み込み、各ノードのDOMNode::nodeTypeプロパティを表示します。
5 *
6 * XMLReaderを使用してXMLを順次処理し、各ノードをDOMNodeオブジェクトに展開(expand)します。
7 * その後、展開されたDOMNodeオブジェクトのnodeTypeプロパティにアクセスし、
8 * ノードの種類を示す整数値と、それに対応する人間が読める名前を表示します。
9 *
10 * これは、XMLの構造を理解し、特定の種類のノード(要素、テキスト、CDATAなど)を
11 * プログラムで識別・処理する際に非常に役立ちます。
12 *
13 * @param string $xmlString 処理するXML文字列
14 */
15function processXmlAndDisplayNodeTypes(string $xmlString): void
16{
17    // XMLReaderのインスタンスを作成
18    $reader = new XMLReader();
19
20    // XML文字列を開く
21    if (!$reader->xml($xmlString)) {
22        echo "エラー: XML文字列を読み込めませんでした。\n";
23        return;
24    }
25
26    echo "--- XMLノードタイプ解析結果 ---\n";
27
28    // XMLのノードを1つずつ読み進める
29    while ($reader->read()) {
30        // 現在のXMLReaderノードをDOMNodeオブジェクトに展開(変換)する
31        // expand()は現在のノードがDOMで表現可能な場合にDOMNodeオブジェクトを返します。
32        // そうでない場合(例:属性ノードが読み取られていない場合など)はnullを返すことがあります。
33        $domNode = $reader->expand();
34
35        // DOMNodeオブジェクトが正常に取得できた場合のみ処理
36        if ($domNode instanceof DOMNode) {
37            // DOMNode::nodeTypeプロパティを取得
38            $nodeType = $domNode->nodeType;
39            $nodeName = $domNode->nodeName; // ノードの名前(要素名、#textなど)
40
41            echo sprintf(
42                "ノード名: %-15s | DOMNode::nodeType: %2d | 種類: %s\n",
43                $nodeName,
44                $nodeType,
45                getNodeTypeName($nodeType)
46            );
47        }
48    }
49
50    // XMLReaderを閉じる
51    $reader->close();
52    echo "------------------------------\n";
53}
54
55/**
56 * nodeTypeの整数値に対応するノードの種類名を返します。
57 * PHPのXML関連定数を使用して、人間が読める形式に変換します。
58 *
59 * @param int $type DOMNode::nodeTypeプロパティの整数値
60 * @return string ノードの種類名
61 */
62function getNodeTypeName(int $type): string
63{
64    // PHP 8のmatch式は、switch文よりも簡潔に値を返す場合に便利です。
65    return match ($type) {
66        XML_ELEMENT_NODE        => '要素ノード',
67        XML_ATTRIBUTE_NODE      => '属性ノード',
68        XML_TEXT_NODE           => 'テキストノード',
69        XML_CDATA_SECTION_NODE  => 'CDATAセクションノード',
70        XML_ENTITY_REF_NODE     => 'エンティティ参照ノード',
71        XML_ENTITY_NODE         => 'エンティティ宣言ノード',
72        XML_PI_NODE             => '処理命令ノード', // Processing Instruction
73        XML_COMMENT_NODE        => 'コメントノード',
74        XML_DOCUMENT_NODE       => 'ドキュメントノード',
75        XML_DOCUMENT_TYPE_NODE  => 'DTDノード',
76        XML_DOCUMENT_FRAG_NODE  => 'ドキュメントフラグメントノード',
77        XML_NOTATION_NODE       => '記法ノード',
78        XML_HTML_DOCUMENT_NODE  => 'HTMLドキュメントノード',
79        XML_DTD_NODE            => 'DTDノード',
80        XML_ELEMENT_DECL_NODE   => '要素宣言ノード',
81        XML_ATTRIBUTE_DECL_NODE => '属性宣言ノード',
82        XML_ENTITY_DECL_NODE    => 'エンティティ宣言ノード',
83        XML_NAMESPACE_DECL_NODE => '名前空間宣言ノード',
84        default                 => '不明なノードタイプ',
85    };
86}
87
88// サンプルXMLデータ
89$sampleXml = <<<XML
90<?xml version="1.0" encoding="UTF-8"?>
91<!-- この文書はXMLのサンプルです -->
92<bookstore>
93    <book category="cooking">
94        <title lang="en">Everyday Italian</title>
95        <author>Giada De Laurentiis</author>
96        <year>2005</year>
97        <price>30.00</price>
98    </book>
99    <book category="children">
100        <title lang="en">Harry Potter</title>
101        <author>J K. Rowling</author>
102        <year>2005</year>
103        <price>29.99</price>
104    </book>
105    <!-- CDATAセクションの例 -->
106    <example><![CDATA[<script>alert("Hello XML!");</script>]]></example>
107</bookstore>
108XML;
109
110// 関数を呼び出して処理を実行
111processXmlAndDisplayNodeTypes($sampleXml);

このPHPサンプルコードは、XMLデータを効率的に読み込みながら、その構造をプログラムで理解する方法を示しています。特に、DOMNodeクラスのnodeTypeプロパティが、XML文書内の各部分(ノード)がどのような種類であるかを数値で教えてくれる役割を担っています。このプロパティは引数を取らず、ノードの種類を示す整数値(int型)を返します。

コードではまずXMLReaderオブジェクトを使い、大きなXMLデータでもメモリに負荷をかけずに順次読み進めます。XMLReader::expand()メソッドは、現在読み込んでいるXMLノードを、より詳細な操作が可能なDOMNodeオブジェクトに変換します。このDOMNodeオブジェクトからnodeTypeプロパティを取得することで、そのノードが要素なのか、テキストなのか、コメントなのかといった種類を識別できます。得られた整数値は、getNodeTypeName関数によって「要素ノード」「テキストノード」といった人間が読める名前に変換されて表示されます。このように、nodeTypeプロパティを利用することで、XML構造を理解し、特定の種類のノードに対してプログラムで適切な処理を行うための基礎となります。システム開発においてXMLデータを扱う際に非常に有用な知識です。

このサンプルコードは、XMLを順次効率よく処理するXMLReaderと、XMLノードを操作できるDOMNodeの連携を示しています。XMLReader::expand()は現在のノードをDOMNodeオブジェクトに変換し、より詳細な情報を取得可能にします。ただし、すべてのノードがDOMNodeに展開できるわけではなく、特に属性ノードなどはnullを返すため、if ($domNode instanceof DOMNode)による厳密なチェックが重要です。DOMNode::nodeTypeプロパティは、ノードの種類を整数値(例: XML_ELEMENT_NODE)で返します。この値を用いて、特定の種類のノードを識別し処理する際に非常に役立ちます。大規模なXMLを扱う場合は、expand()を多用するとメモリ消費が増える可能性があるため、注意が必要です。処理後は必ずXMLReader::close()でリソースを解放しましょう。

関連コンテンツ

関連プログラミング言語