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

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

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

作成日: 更新日:

基本的な使い方

nodeTypeプロパティは、Dom\Notationオブジェクトが示すノードの型を整数値で保持するプロパティです。

Dom\Notationクラスは、PHPのDOM拡張機能において、XMLドキュメント型定義(DTD)内で宣言される表記法(NOTATION)を表すために使用されます。NOTATIONは、XMLドキュメントが外部の非XMLデータを参照する際に、そのデータのフォーマットを識別する目的で利用されます。例えば、特定の画像フォーマット(PNGやJPEGなど)やアプリケーション固有のデータタイプを指定する際に用いられます。

このnodeTypeプロパティは、DOMツリー内のあらゆるノードに共通して定義されているもので、各ノードがどのような種類の情報を含んでいるのかを数値で識別するために用いられます。特にDom\Notationオブジェクトの場合、nodeTypeプロパティは常にDOM_NOTATION_NODEという定数値を保持します。この定数値は、現在のノードがXMLのNOTATION宣言を表す特別なノードタイプであることを明確に示しています。

システムエンジニアを目指す初心者の方にとって、このプロパティは、DOMツリーをプログラム的に走査する際に、現在処理しているノードがXMLの表記法に関する情報を含んでいるかどうかを簡単に判別するために非常に有用です。これにより、特定のNOTATIONノードを効率的に見つけ出し、それに応じた適切な処理を実行するコードを記述することが可能になります。

構文(syntax)

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

引数(parameters)

引数なし

引数はありません

戻り値(return)

int

Dom\Notation クラスの nodeType プロパティは、ノードの種類を示す整数値を返します。

サンプルコード

PHP DOMNotation nodeType を取得する

1<?php
2
3declare(strict_types=1);
4
5/**
6 * Dom\Notation ノードの nodeType プロパティの値を確認するサンプル関数です。
7 *
8 * Dom\Notation は DTD (文書型定義) 内で宣言されるため、
9 * DTD を含む XML を DOMDocument で解析し、ノーテーションノードを取得します。
10 * ノーテーションノードの nodeType は、常に 12 (定数: XML_NOTATION_NODE) となります。
11 */
12function demonstrateNotationNodeType(): void
13{
14    // DTDでノーテーション ('jpeg') を宣言したXML文字列を定義
15    $xmlString = <<<XML
16    <?xml version="1.0" encoding="UTF-8"?>
17    <!DOCTYPE root [
18        <!NOTATION jpeg PUBLIC "image/jpeg">
19    ]>
20    <root/>
21    XML;
22
23    // DOMDocumentオブジェクトを生成し、XML文字列を読み込みます
24    $dom = new \DOMDocument();
25    $dom->loadXML($xmlString);
26
27    // XMLの文書型定義 (DOCTYPE) ノードを取得します
28    $docType = $dom->doctype;
29
30    // 文書型定義が存在する場合のみ処理を続行します
31    if ($docType instanceof \DOMDocumentType) {
32        // 文書型定義からノーテーションのリスト (DOMNamedNodeMap) を取得します
33        $notations = $docType->notations;
34
35        // ノーテーションのリストから 'jpeg' という名前のノーテーションノードを取得します
36        $notationNode = $notations->getNamedItem('jpeg');
37
38        // ノーテーションノードが取得できた場合
39        if ($notationNode instanceof \DOMNotation) {
40            // Dom\Notation オブジェクトの nodeType プロパティの値を出力します。
41            // この値は、ノーテーションノードを示す整数値 12 です。
42            echo "Node Name: " . $notationNode->nodeName . PHP_EOL;
43            echo "Node Type: " . $notationNode->nodeType . PHP_EOL;
44
45            // PHPの定義済み定数 `XML_NOTATION_NODE` と比較して確認します
46            if ($notationNode->nodeType === XML_NOTATION_NODE) {
47                echo "The nodeType matches the constant XML_NOTATION_NODE." . PHP_EOL;
48            }
49        }
50    }
51}
52
53// 関数を実行して結果を表示します
54demonstrateNotationNodeType();
55

このサンプルコードは、PHPのDom\Notationクラスが持つnodeTypeプロパティの役割を解説するものです。

nodeTypeプロパティは、XML文書を構成する各ノードがどの種類(要素、属性、テキストなど)に属するかを識別するための整数値を返します。このプロパティは読み取り専用で、引数はありません。Dom\Notationオブジェクトの場合、nodeTypeプロパティは常にノーテーションを示す整数値12を返します。

コードでは、まずDTD(文書型定義)内で'jpeg'というノーテーションを宣言したXML文字列を準備します。Dom\NotationオブジェクトはDTDからのみ取得できるため、この準備が不可欠です。次に、DOMDocumentクラスでこのXMLを解析し、文書型定義ノードを取得します。そこから、notationsプロパティを通じて目的のノーテーションノードを取得し、そのnodeTypeプロパティの値を出力しています。

実行結果では、nodeType12であることが示され、これはPHPの定義済み定数XML_NOTATION_NODEの値と一致します。このように、nodeTypeプロパティを使うことで、取得したノードがノーテーションであることをプログラムで正確に判定できます。

Dom\Notation ノードは、XML文書の要素とは異なり、文書型定義(DTD)内で宣言される特殊なノードです。このノードを取得するには、まず DOMDocument オブジェクトの doctype プロパティを経由する必要がある点に注意してください。DTDを持たないXMLからは取得できません。nodeType プロパティの値は、Dom\Notation の場合、常に 12 となります。この数値はノードの種類を識別するためのもので、コード内では 12 のような直接的な数値(マジックナンバー)の代わりに、PHPの定義済み定数 XML_NOTATION_NODE を使って比較すると可読性が高まります。また、文書にDTDや指定のノーテーションが存在しない場合に備え、プロパティにアクセスする前に null でないかを確認する処理は、エラーを避けるために重要です。

PHP DOM Notation nodeType を確認する

1<?php
2
3/**
4 * Dom\Notation オブジェクトの nodeType プロパティの値を確認します。
5 *
6 * DTD(文書型定義)内に定義された NOTATION 宣言を取得し、
7 * そのノードタイプが XML_NOTATION_NODE (整数値 12) であることを示します。
8 */
9function demonstrateNotationNodeType(): void
10{
11    // DTDにNOTATION宣言を含むXML文字列を定義します。
12    $xmlString = <<<XML
13    <?xml version="1.0" encoding="UTF-8"?>
14    <!DOCTYPE doc [
15        <!NOTATION gif SYSTEM "image/gif">
16        <!ELEMENT doc EMPTY>
17    ]>
18    <doc/>
19    XML;
20
21    // DOMDocumentオブジェクトを生成します。
22    $dom = new DOMDocument();
23
24    // XML文字列を読み込みます。
25    $dom->loadXML($xmlString);
26
27    // DocumentTypeノード (<!DOCTYPE ...>) を取得します。
28    // この中にNotationの情報が含まれています。
29    $docType = $dom->doctype;
30
31    if ($docType === null) {
32        echo 'DOCTYPE was not found in the XML document.' . PHP_EOL;
33        return;
34    }
35
36    // Notationノードのリスト (DOMNamedNodeMap) を取得します。
37    $notations = $docType->notations;
38
39    // 'gif' という名前のNotationノード (Dom\Notation) を取得します。
40    $notationNode = $notations->getNamedItem('gif');
41
42    if ($notationNode instanceof \DOMNotation) {
43        // nodeType プロパティは、ノードの種類を示す整数値を返します。
44        // Dom\Notation の場合、この値は常に定数 XML_NOTATION_NODE (12) です。
45        echo 'Node Name: ' . $notationNode->nodeName . PHP_EOL;
46        echo 'Node Type: ' . $notationNode->nodeType . PHP_EOL;
47
48        // 定数と比較して型を検証します。
49        if ($notationNode->nodeType === XML_NOTATION_NODE) {
50            echo 'The nodeType correctly matches XML_NOTATION_NODE.' . PHP_EOL;
51        }
52    } else {
53        echo 'Notation "gif" was not found.' . PHP_EOL;
54    }
55}
56
57// 関数を実行します。
58demonstrateNotationNodeType();
59

PHPのDom\Notationクラスに属するnodeTypeプロパティは、DOMツリー内のノードの種類を識別するための整数値を返します。このプロパティに引数はなく、戻り値はノードの種類を示す整数です。

サンプルコードでは、まずDTD(文書型定義)内に<!NOTATION>宣言を含むXML文字列を準備しています。NOTATIONは、XMLパーサが直接解釈しない外部データの形式を宣言するためのものです。次にDOMDocumentクラスを使ってこのXMLを解析し、文書の型定義情報を持つdoctypeノードを取得します。

doctypeノードが持つnotationsプロパティから、getNamedItem('gif')メソッドを使って'gif'という名前のDom\Notationオブジェクトを取得します。この取得したオブジェクトのnodeTypeプロパティにアクセスすると、そのノードが「ノーテーションノード」であることを示す値が返されます。Dom\Notationオブジェクトの場合、この値は常にPHPの定義済み定数であるXML_NOTATION_NODEとなり、その具体的な整数値は12です。

このようにnodeTypeプロパティを使用することで、取得したノードがどのような種類のノードなのかをプログラムで正確に判別できます。

Dom\Notationオブジェクトは、XML文書内のDTD(文書型定義)で宣言されるため、文書のdoctypeプロパティを経由して取得します。この手順は他のノードと異なるため注意が必要です。nodeTypeプロパティはノードの種類を識別するための整数値を返す読み取り専用のプロパティで、Dom\Notationの場合は常に定数XML_NOTATION_NODE(値は12)を返します。サンプルコードのように、直接数値を書くのではなく定数を使って比較することで、コードの可読性が高まります。また、DTDや指定したNotationが存在しない場合、処理の途中でnullが返されることがあります。予期せぬエラーを防ぐため、オブジェクトを取得した後は必ずnullチェックを行うようにしてください。

関連コンテンツ

関連プログラミング言語