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

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

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

作成日: 更新日:

基本的な使い方

parentNodeプロパティは、所属するDOMNotationオブジェクトの親ノードを保持するプロパティです。PHPのDOM拡張機能の一部として提供されており、XML文書の構造をプログラムで扱う際に利用されます。DOMNotationクラスは、XML文書のDTD(Document Type Definition)内で定義される「記法」を表す特殊なノードです。

このparentNodeプロパティを使用すると、現在のDOMNotationオブジェクトがXML文書の階層構造において、どのノードの子であるかを確認できます。具体的には、このプロパティは現在のDOMNotationオブジェクトの直上にある親ノード、すなわちこのノードを子として持つ上位のノードを返します。返される親ノードはDOMNode型のオブジェクトであり、XML文書内の様々な要素やテキストなどを表すノードの基底クラスです。もし、何らかの理由で親ノードが存在しない場合には、このプロパティはnullを返します。

このプロパティは、XML文書の複雑な構造をプログラムで理解し、特定のノードの位置関係を調べたり、ツリー構造を辿って情報を取得したりする際に非常に有用です。システムエンジニアを目指す初心者の方も、XML文書が木のような階層構造を持っていることをイメージしながら、各ノードの親子関係を把握するためにこのプロパティを活用できます。

構文(syntax)

1<?php
2$dom = new DOMDocument();
3$xmlString = '<!DOCTYPE example [<!NOTATION gif SYSTEM "image/gif">]><example/>';
4$dom->loadXML($xmlString);
5
6$notation = null;
7if ($dom->doctype && $dom->doctype->notations) {
8    foreach ($dom->doctype->notations as $node) {
9        if ($node instanceof DOMNotation) {
10            $notation = $node;
11            break;
12        }
13    }
14}
15
16if ($notation) {
17    $parentNode = $notation->parentNode;
18}

引数(parameters)

引数なし

引数はありません

戻り値(return)

?DOMNode

DOMNotation オブジェクトが所属する親ノードを DOMNode オブジェクト、または親ノードが存在しない場合は null を返します。

サンプルコード

PHP DOM parentNode を使って親ノードを取得する

1<?php
2
3/**
4 * DOMNotationのparentNodeプロパティの使用例を示します。
5 *
6 * DTD(文書型定義)内に定義された記法(Notation)ノードを取得し、
7 * その親ノード(この場合はDOMDocumentTypeノード)の情報を表示します。
8 */
9function showDomNotationParentNode(): void
10{
11    // DTD内に<!NOTATION ...>を含むXML文字列を定義
12    $xmlString = <<<XML
13<?xml version="1.0" encoding="UTF-8"?>
14<!DOCTYPE root [
15  <!NOTATION png SYSTEM "image/png">
16  <!ELEMENT root (#PCDATA)>
17]>
18<root>Hello World</root>
19XML;
20
21    // DOMDocumentオブジェクトを作成し、XMLを読み込む
22    $dom = new DOMDocument();
23    // 外部DTDを読み込まないように設定(セキュリティ上の推奨事項)
24    $dom->resolveExternals = false;
25    $dom->loadXML($xmlString);
26
27    // DocumentTypeノード(<!DOCTYPE ...>全体)を取得
28    $docType = $dom->doctype;
29
30    if ($docType === null) {
31        echo 'DocumentTypeノードが見つかりませんでした。' . PHP_EOL;
32        return;
33    }
34
35    // DocumentTypeから記法(Notation)のリストを取得
36    $notations = $docType->notations;
37
38    // 'png'という名前の記法ノード(DOMNotation)を取得
39    $notationNode = $notations->getNamedItem('png');
40
41    if ($notationNode instanceof DOMNotation) {
42        // DOMNotation::parentNodeプロパティを使って親ノードを取得
43        // 記法ノードの親は、通常それを定義しているDocumentTypeノード
44        $parentNode = $notationNode->parentNode;
45
46        if ($parentNode) {
47            echo "記法名: " . $notationNode->nodeName . PHP_EOL;
48            echo "公開識別子: " . $notationNode->publicId . PHP_EOL;
49            echo "システム識別子: " . $notationNode->systemId . PHP_EOL;
50            echo PHP_EOL;
51
52            // 親ノードの情報を表示
53            echo "親ノードのクラス名: " . get_class($parentNode) . PHP_EOL;
54            echo "親ノードのノード名: " . $parentNode->nodeName . PHP_EOL;
55        } else {
56            echo "'{$notationNode->nodeName}' の親ノードは存在しません。" . PHP_EOL;
57        }
58    } else {
59        echo '指定された記法ノードが見つかりませんでした。' . PHP_EOL;
60    }
61}
62
63// 関数を実行
64showDomNotationParentNode();
65
66?>

DOMNotationクラスのparentNodeプロパティは、特定の記法(Notation)ノードの親ノードを取得するために使用されます。記法ノードはXML文書のDTD(文書型定義)内で定義されるため、その親ノードは通常、DTD全体を表すDOMDocumentTypeノードになります。

このサンプルコードは、まず<!NOTATION png ...>という記法定義を含むXML文字列をDOMDocumentオブジェクトに読み込みます。次に、doctypeプロパティを通じて文書型定義(DOMDocumentType)ノードを取得し、さらにその中のnotationsプロパティから'png'という名前の記法(DOMNotation)ノードを探します。

ハイライトとなる$notationNode->parentNodeの部分で、取得した記法ノードの親ノードにアクセスしています。コードの実行結果では、親ノードのクラス名がDOMDocumentTypeであることが示され、記法ノードが正しくDTDに属していることが確認できます。

このプロパティは引数を取らず、戻り値として親ノードであるDOMNodeオブジェクトを返します。親が存在しない場合にはnullが返されます。

このコードはXMLのDTD(文書型定義)内で定義された記法ノードの親ノードを取得する例です。parentNodeプロパティは、現在のノードが属する親ノードを返します。DOMNotationの場合、親はそれが定義されているDOMDocumentTypeノードです。注意点として、parentNodeの戻り値はnull許容型のため、親が存在しない場合にnullを返します。そのため、プロパティにアクセスした後は、サンプルコードのように必ずnullチェックを行ってください。同様に、$dom->doctypeなどもnullになる可能性があるため、各段階でのチェックが重要です。また、安全のため、外部のDTDを読み込まないようにする$dom->resolveExternals = false;の設定は、意図しない外部リソースへのアクセスを防ぐために推奨されます。

関連コンテンツ

関連プログラミング言語