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

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

作成日: 更新日:

基本的な使い方

nodeTypeプロパティは、DOMElementノードの型を表す読み取り専用のプロパティです。このプロパティの値は、定義済みの定数(例えば、XML_ELEMENT_NODE, XML_ATTRIBUTE_NODE, XML_TEXT_NODE など)のいずれかになります。DOM(Document Object Model)は、XMLやHTMLドキュメントをプログラムから操作するためのAPIであり、DOMElementはDOMにおける要素ノードを表すクラスです。nodeTypeプロパティを確認することで、特定のノードが要素、属性、テキストなど、どのような種類のノードであるかを判別できます。

システムエンジニアを目指す上で、XMLやHTMLなどの構造化されたデータを扱う際に、このプロパティは非常に重要になります。例えば、XMLドキュメントを解析し、特定の要素のみを処理したい場合、nodeTypeプロパティを用いて要素ノードであることを確認してから処理を行うことができます。また、ノードの種類によって異なる処理を実装する場合にも、nodeTypeプロパティを用いた条件分岐が有効です。具体的には、switch文やif文を用いて、nodeTypeの値に応じて処理を切り替えることができます。このプロパティを使用することで、DOMツリーを効率的に走査し、必要な情報を正確に取得することができます。

構文(syntax)

1DOMElement::$nodeType

引数(parameters)

引数なし

引数はありません

戻り値(return)

int

DOMElementオブジェクトのノードの種類を表す整数値を返します。

サンプルコード

PHP DOM nodetype で要素の種類を確認する

1<?php
2
3// DOMDocument オブジェクトを新しく作成します。
4$dom = new DOMDocument();
5
6// 解析するHTML文字列をロードします。
7// この例では、簡単な<article>要素と<p>要素を使用します。
8$html = <<<HTML
9<article>
10    <h1>これは記事のタイトルです</h1>
11    <p>これは最初の段落です。</p>
12    <p>これは2番目の段落です。</p>
13</article>
14HTML;
15$dom->loadHTML($html);
16
17// ドキュメントから最初の<article>要素を取得します。
18// getElementsByTagName は DOMNodeList を返すため、item(0) で最初の要素にアクセスします。
19$articleElement = $dom->getElementsByTagName('article')->item(0);
20
21// ドキュメントから最初の<p>要素を取得します。
22$paragraphElement = $dom->getElementsByTagName('p')->item(0);
23
24// DOMElement::nodeType は、そのノードが何であるかを示す整数値を返します。
25// DOMElement クラスのインスタンスの場合、nodeType は常に XML_ELEMENT_NODE (値は 1) になります。
26
27echo "--- DOMElement::nodeType の使用例 ---" . PHP_EOL;
28
29if ($articleElement instanceof DOMElement) {
30    echo "要素名: " . $articleElement->nodeName . PHP_EOL;
31    echo "nodeType: " . $articleElement->nodeType . PHP_EOL;
32    // XML_ELEMENT_NODE 定数の値(要素ノードを示す)と比較します。
33    echo "(XML_ELEMENT_NODE 定数の値は " . XML_ELEMENT_NODE . " です)" . PHP_EOL . PHP_EOL;
34} else {
35    echo "<article> 要素が見つかりませんでした。" . PHP_EOL . PHP_EOL;
36}
37
38if ($paragraphElement instanceof DOMElement) {
39    echo "要素名: " . $paragraphElement->nodeName . PHP_EOL;
40    echo "nodeType: " . $paragraphElement->nodeType . PHP_EOL;
41    // XML_ELEMENT_NODE 定数の値(要素ノードを示す)と比較します。
42    echo "(XML_ELEMENT_NODE 定数の値は " . XML_ELEMENT_NODE . " です)" . PHP_EOL;
43} else {
44    echo "<p> 要素が見つかりませんでした。" . PHP_EOL;
45}
46
47?>

このPHPのサンプルコードは、DOMツリー内のノードの種類を識別するためのDOMElement::nodeTypeプロパティの使用方法を説明しています。

まず、DOMDocumentオブジェクトを新しく作成し、読み込むHTML文字列を定義します。このHTMLは、<article>要素と二つの<p>要素を含む簡単な構造です。loadHTMLメソッドを使って、このHTML文字列をDOMDocumentオブジェクトにロードします。

次に、getElementsByTagNameメソッドを用いて、ドキュメントから特定のHTML要素、具体的には最初の<article>要素と最初の<p>要素を取得します。これらの要素はDOMElementクラスのインスタンスとして扱われます。

DOMElement::nodeTypeプロパティは引数を取らず、そのノードがどのような種類のノードであるかを示す整数値をint型で返します。DOMElementクラスのインスタンス、つまりHTMLタグのような要素ノードの場合、nodeTypeは常にXML_ELEMENT_NODEという定数と同じ値である1を返します。

サンプルコードでは、取得した<article>要素と<p>要素のnodeName(要素名)とnodeTypeプロパティの値をそれぞれ表示しています。これにより、両方の要素が同じnodeTypeである1(XML_ELEMENT_NODE)を返していることを確認できます。このプロパティは、DOM操作においてノードの種類を判別する際に活用されます。

DOMElement::nodeTypeは、そのノードが何であるかを示す整数値を返します。しかし、DOMElementクラスのインスタンスにアクセスしている場合、そのノードは常に要素ノードであり、nodeTypeXML_ELEMENT_NODE(値は1)を返します。この点は初心者が混同しやすいポイントですので注意してください。

より汎用的にテキストノードやコメントノードなど、様々な種類のノードを判別したい場合は、親クラスであるDOMNodenodeTypeプロパティを利用すると良いでしょう。

また、getElementsByTagNameのようなメソッドは、指定した要素が見つからない場合にnullを返す可能性があります。そのため、取得した変数が実際にDOMElementのインスタンスであるか(例: $element instanceof DOMElement)を確認してからプロパティにアクセスすることで、予期せぬエラーを防ぎ、安全にコードを実行できます。

PHP XMLReader: DOMElement::nodeType を取得する

1<?php
2
3/**
4 * XMLReader を使用してXMLを読み込み、要素ノードの DOMElement::nodeType プロパティを取得するサンプル関数。
5 *
6 * この関数は、XMLReader でXMLをストリーム処理し、各要素ノードに遭遇した際に
7 * そのノードを DOM オブジェクトに展開し、DOMElement::nodeType プロパティを
8 * 参照する方法を示します。
9 *
10 * システムエンジニアを目指す初心者向けに、XML処理の基本とDOM::nodeTypeの
11 * 概念を理解できるよう、簡潔にまとめています。
12 */
13function processXmlAndGetNodeTypes(): void
14{
15    // 読み込むXMLデータを用意します。
16    // ここでは、簡単な本の情報を含むXML文字列を使用します。
17    $xmlString = <<<XML
18<?xml version="1.0" encoding="UTF-8"?>
19<catalog>
20    <book id="bk101">
21        <author>Gambardella, Matthew</author>
22        <title>XML Developer's Guide</title>
23        <genre>Computer</genre>
24        <price>44.95</price>
25        <publish_date>2000-10-01</publish_date>
26        <description>An in-depth look at creating applications with XML.</description>
27    </book>
28    <book id="bk102">
29        <author>Garcia, Fanny</author>
30        <title>Learning PHP</title>
31        <genre>Programming</genre>
32        <price>39.99</price>
33        <publish_date>2023-01-15</publish_date>
34        <description>A beginner's guide to PHP programming.</description>
35    </book>
36</catalog>
37XML;
38
39    $reader = new XMLReader();
40
41    // XML文字列を開き、リーダーに読み込ませます。
42    // 失敗した場合はエラーメッセージを表示して終了します。
43    if (!$reader->XML($xmlString)) {
44        echo "エラー: XMLファイルのオープンに失敗しました。\n";
45        return;
46    }
47
48    echo "XMLノードタイプの処理を開始します。\n";
49    echo "--------------------------------------\n";
50
51    // XMLをノードごとに読み進めます。
52    while ($reader->read()) {
53        // 現在のノードが要素ノード(例: <catalog>, <book>, <author>など)であるかチェックします。
54        // XMLReader::ELEMENT と DOM_ELEMENT_NODE はどちらも要素ノードを表す定数で、値は1です。
55        if ($reader->nodeType === XMLReader::ELEMENT) {
56            echo "\n要素ノードが見つかりました: <" . $reader->name . ">\n";
57
58            // XMLReader で読み込んだ現在のノードを DOMNode オブジェクトとして取得します。
59            // 要素ノードの場合、DOMElement のインスタンスが返されます。
60            $node = $reader->expand();
61
62            // 取得したノードが DOMElement のインスタンスであることを確認します。
63            if ($node instanceof DOMElement) {
64                // DOMElement::nodeType プロパティにアクセスし、ノードタイプを表示します。
65                // 要素ノードなので、値は DOM_ELEMENT_NODE (つまり 1) になります。
66                echo "  -> DOMElement::nodeType の値: " . $node->nodeType . "\n";
67                echo "     (DOM_ELEMENT_NODE の定数値も " . DOM_ELEMENT_NODE . " です)\n";
68                echo "  -> ノード名: " . $node->nodeName . "\n";
69                echo "  -> ノードのテキストコンテンツ: '" . trim($node->textContent) . "'\n"; // 前後の空白を除去して表示
70            } else {
71                echo "  エラー: expand() が DOMElement ではないノードを返しました。\n";
72            }
73        }
74    }
75
76    // XMLReader のリソースを解放します。
77    $reader->close();
78    echo "\n--------------------------------------\n";
79    echo "XMLノードタイプの処理が完了しました。\n";
80}
81
82// サンプル関数を実行します。
83processXmlAndGetNodeTypes();

このPHPサンプルコードは、XMLReaderエクステンションを用いてXMLデータを読み込み、XML構造内の各ノードがどのような種類であるかを識別する方法を、システムエンジニアを目指す初心者向けに解説しています。コードでは、XMLReaderでXMLをストリーム処理する中で要素ノードに遭遇した際、そのノードをDOMオブジェクト、具体的にはDOMElementのインスタンスとして展開し、DOMElement::nodeTypeプロパティの値を参照しています。

DOMElement::nodeTypeプロパティは、引数を取らず、現在のDOMノードのタイプを整数値として返します。この戻り値の整数値は、ノードが要素(タグ)、属性、テキストコンテンツなど、どのタイプであるかを識別するために利用されます。例えば、このサンプルコードで示されているように、<book><author>のような要素ノードの場合、nodeTypeプロパティはDOM_ELEMENT_NODEという定数と同じ値(通常は1)を返します。

このプロパティを活用することで、XMLデータの中から特定の種類のノードだけを効率的に抽出し、そのノードに対して必要な解析や処理を適用することが可能になります。XMLドキュメントの構造を理解し、特定の情報を取り出す上で、ノードタイプを正確に判断することは、プログラミングにおける基本的ながらも非常に重要な技術です。

DOMElement::nodeTypeを参照するには、XMLReader::expand()でノードをDOMオブジェクトに展開する必要があります。nodeTypeはノード種別を整数値(要素ノードはDOM_ELEMENT_NODEと同じ値1)で返します。expand()はメモリ消費を伴うため、大規模XMLでは注意してください。型検証はinstanceofで行うと安全です。処理後はXMLReader::close()でリソースを必ず解放してください。

関連コンテンツ

関連プログラミング言語

【PHP8.x】nodeTypeプロパティの使い方 | いっしー@Webエンジニア