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

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

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

作成日: 更新日:

基本的な使い方

nodeTypeプロパティは、DOMNotationクラスのインスタンスがDOMツリー内でどのような種類のノードであるかを示す値を保持するプロパティです。

DOMNotationクラスは、XMLドキュメントにおいて、外部の非XMLデータ形式を宣言するために用いられる「記法(NOTATION)」という要素を表現します。例えば、特定のグラフィックファイル形式(例: JPEG)が、システム上でどのように識別されるかをXMLドキュメント内で定義する際に利用されます。

DOM(Document Object Model)は、XMLやHTMLなどのドキュメントを、プログラムから操作しやすいように木構造(ツリー)として表現します。このツリーの各要素を「ノード」と呼び、nodeTypeプロパティは、そのノードが要素なのか、テキストなのか、属性なのかといった種類を識別するための情報を格納しています。

DOMNotationオブジェクトのnodeTypeプロパティは、常にXML_NOTATION_NODE、またはPHP 5.1.0以降ではより一般的なDOM_NOTATION_NODEという定数値を返します。これらの定数は、そのノードが紛れもなく記法ノードであることを明確に示します。

システム開発においてDOMツリーを探索し、特定の種類のノードに対してのみ処理を行いたい場合に、このnodeTypeプロパティを参照してノードの種類を判別します。これにより、記法ノードに特化した処理を安全かつ正確に実装することが可能になります。

構文(syntax)

1<?php
2
3$nodeType = $notation->nodeType;

引数(parameters)

引数なし

引数はありません

戻り値(return)

int

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

サンプルコード

PHP DOMNotation nodeType を確認する

1<?php
2
3/**
4 * DOMNotationのnodeTypeプロパティを確認するサンプルコード
5 *
6 * DOMDocumentを使用してDTD(文書型定義)を含むXMLを解析し、
7 * 記法ノード(DOMNotation)を取得して、そのnodeTypeプロパティを表示します。
8 * DOMNotationのnodeTypeは常に定数 XML_NOTATION_NODE (値は 12) になります。
9 */
10function displayDomNotationNodeType(): void
11{
12    // DTD内で記法(NOTATION)を定義したXML文字列
13    $xmlString = <<<XML
14    <?xml version="1.0" encoding="UTF-8"?>
15    <!DOCTYPE root [
16      <!NOTATION jpeg PUBLIC "image/jpeg">
17      <!NOTATION png SYSTEM "image/png">
18    ]>
19    <root/>
20    XML;
21
22    // DOMDocumentオブジェクトを作成
23    $dom = new DOMDocument();
24
25    // XML文字列を読み込む
26    $dom->loadXML($xmlString);
27
28    // DocumentTypeノード(<!DOCTYPE ...>の部分)を取得
29    // このノードは notations プロパティを持つ
30    $doctype = $dom->doctype;
31
32    if ($doctype instanceof DOMDocumentType) {
33        // 全ての記法ノード(DOMNotation)を取得
34        $notations = $doctype->notations;
35
36        echo "DTDから見つかった記法(Notation)ノードのnodeTypeを確認します。" . PHP_EOL;
37
38        // 見つかった各記法ノードをループ処理
39        foreach ($notations as $name => $notation) {
40            // $notation は DOMNotation オブジェクト
41            if ($notation instanceof DOMNotation) {
42                // nodeTypeプロパティの値を出力
43                printf(
44                    "- 記法名 '%s': nodeType = %d (定数: XML_NOTATION_NODE)\n",
45                    $name,
46                    $notation->nodeType
47                );
48            }
49        }
50
51        // 比較のために定数の値も表示
52        echo "参考: 定数 XML_NOTATION_NODE の値は " . XML_NOTATION_NODE . " です。" . PHP_EOL;
53    } else {
54        echo "DTDが見つかりませんでした。" . PHP_EOL;
55    }
56}
57
58// 関数を実行
59displayDomNotationNodeType();

このサンプルコードは、PHPのDOM拡張機能を使い、XML文書内の記法ノード(DOMNotation)が持つ nodeType プロパティの値を確認する方法を示します。nodeType プロパティは、XML文書を構成する各部分(ノード)がどのような種類なのかを識別するための整数値を返します。このプロパティに引数はなく、戻り値はint型です。

DOMNotationオブジェクトの場合、nodeTypeプロパティは常にPHPの定義済み定数であるXML_NOTATION_NODE(値は12)を返します。これは、そのノードが「記法」であることを示す固定値です。

コードでは、まずDOMDocumentクラスを用いて、DTD(文書型定義)内で記法(<!NOTATION>)が宣言されたXML文字列を解析します。次に、文書型定義ノード(DOMDocumentType)からnotationsプロパティを通じて全ての記法ノードを取得します。最後に、foreachループで各記法ノード(DOMNotationオブジェクト)を取り出し、そのnodeTypeプロパティの値を出力して、それが期待通り定数XML_NOTATION_NODEの値と一致することを確認しています。

このサンプルコードのnodeTypeプロパティは、ノードの種類を識別するための数値です。DOMNotationの場合、この値は常に12(定数名XML_NOTATION_NODE)となり、読み取り専用で変更はできません。注意点として、DOMNotationはXML内のDTD(文書型定義)に記述されるため、DTDを持たないXML文書では取得できません。コードにあるように、DOMDocumentオブジェクトのdoctypeプロパティがnullでないことを必ず確認してから利用してください。この確認を怠ると、doctypeが存在しない場合にエラーが発生する原因となります。このプロパティは、様々な種類のノードを処理する際に、対象が記法ノードであるかを安全に判別するために使います。

PHP DOM Notation nodeType を取得する

1<?php
2
3/**
4 * DOMNotationのnodeTypeプロパティの例を示します。
5 *
6 * このコードは、DTD(Document Type Definition)を含むXMLを解析し、
7 * 宣言された記法(Notation)ノードを取得して、そのnodeTypeを表示します。
8 */
9function displayDomNotationNodeType(): void
10{
11    // DTD内で記法(Notation)を宣言したXML文字列を定義します。
12    // <!NOTATION jpeg ...> の部分が記法(Notation)宣言です。
13    $xmlString = <<<XML
14<?xml version="1.0" encoding="UTF-8"?>
15<!DOCTYPE doc [
16  <!NOTATION jpeg SYSTEM "image/jpeg">
17]>
18<doc />
19XML;
20
21    // DOMDocumentオブジェクトを作成します。
22    $dom = new DOMDocument();
23    
24    // XML文字列を読み込み、DOMツリーを構築します。
25    $dom->loadXML($xmlString);
26
27    // XMLのDocumentTypeノード(<!DOCTYPE ...>)を取得します。
28    $doctype = $dom->doctype;
29
30    // DocumentTypeノードが存在する場合のみ処理を続行します。
31    if ($doctype) {
32        // notationsプロパティから、指定した名前('jpeg')の記法ノードを取得します。
33        // notationsは、DTDで宣言された全ての記法を格納するDOMNamedNodeMapです。
34        $notation = $doctype->notations->getNamedItem('jpeg');
35
36        // 取得したノードがDOMNotationのインスタンスであることを確認します。
37        if ($notation instanceof DOMNotation) {
38            // DOMNotationオブジェクトのnodeTypeプロパティの値を出力します。
39            // DOMNotationノードのタイプは、定数 XML_NOTATION_NODE で表され、
40            // その値は常に 12 です。
41            echo "Node Name: " . $notation->nodeName . PHP_EOL;
42            echo "Node Type: " . $notation->nodeType . PHP_EOL;
43
44            // 定数との比較も行います。
45            if ($notation->nodeType === XML_NOTATION_NODE) {
46                echo "This node is of type XML_NOTATION_NODE (12)." . PHP_EOL;
47            }
48        }
49    }
50}
51
52// 関数を実行して結果を表示します。
53displayDomNotationNodeType();

PHPのDOMNotationクラスに属するnodeTypeプロパティは、DOMツリー内のノードの種類を識別するための整数値を返します。このプロパティは、対象のノードがどのような種類のものか(要素、属性、テキストなど)をプログラムで判断する際に使用されます。DOMNotationオブジェクトの場合、nodeTypeは常に記法(Notation)ノードであることを示す特定の値を返します。

サンプルコードでは、まずDTD(文書型定義)内で<!NOTATION>を用いて宣言された「記法」を含むXML文字列を準備します。次に、DOMDocumentクラスでこのXMLを解析し、文書の型定義部分(doctype)からnotationsプロパティを経由して、特定の記法ノード(DOMNotationオブジェクト)を取得しています。

そして、取得したDOMNotationオブジェクトのnodeTypeプロパティにアクセスすると、その値が出力されます。このプロパティは引数を取らず、戻り値としてノードの種類を表す整数(int)を返します。DOMNotationノードの場合、この値は常に12です。この数値はPHPの定義済み定数XML_NOTATION_NODEと等しいため、コード内でノードが記法であるかを確実に判定できます。

DOMNotationは、XML文書内のDTD(文書型定義)で宣言される「記法」を表す特殊なノードです。通常のXML要素とは異なり、このノードを扱うにはDTDを含むXMLを読み込む必要があります。コードのように、XMLにDOCTYPE宣言がなければ$dom->doctypenullを返すため、必ず存在を確認してからプロパティにアクセスしてください。nodeTypeプロパティはノードの種類を識別するための整数値で、DOMNotationの場合は常に定数XML_NOTATION_NODE(値は12)となります。このプロパティは、DOMツリーを走査する際に、ノードの種類を判別して処理を分岐させる目的で利用します。数値を直接比較するよりも、XML_NOTATION_NODEのような定義済み定数を使うと、コードの可読性が高まります。

関連コンテンツ

関連プログラミング言語

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