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

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

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

作成日: 更新日:

基本的な使い方

nextSiblingプロパティは、Dom\Notationオブジェクトの次の兄弟ノードを保持するプロパティです。

Dom\Notationクラスは、XMLの文書型定義(DTD)内で宣言される記法(notation)要素を表すためのクラスであり、DOM (Document Object Model) ツリーの一部として扱われます。このプロパティは、現在のDom\Notationノードと親子関係が同じで、かつDOMツリーの順序において現在のノードの直後に位置するノードにアクセスするために使用されます。

具体的には、あるDom\Notationノードから、同じ階層にある次の要素やテキストノードなどを参照したい場合に、このnextSiblingプロパティを利用します。もし現在のノードの直後に兄弟ノードが存在しない場合、このプロパティはnullを返します。この機能は、XMLドキュメントのDOMツリーを順次走査し、特定のノードから次のノードへと移動しながら処理を行う際などに役立ちます。返されるノードはDom\Nodeオブジェクトであり、その具体的な型は次の兄弟ノードの種類によって異なります。

構文(syntax)

1<?php
2
3$xmlString = <<<XML
4<?xml version="1.0" encoding="utf-8" ?>
5<!DOCTYPE doc [
6    <!NOTATION notation1 PUBLIC "urn:public-id-1">
7    <!NOTATION notation2 PUBLIC "urn:public-id-2">
8]>
9<doc></doc>
10XML;
11
12$doc = new DOMDocument();
13$doc->loadXML($xmlString);
14
15// 'notation1' という名前の Notation ノードを取得します。
16$firstNotation = $doc->doctype->notations->getNamedItem('notation1');
17
18// nextSibling プロパティは、同じ階層にある次のノードを返します。
19$next = $firstNotation->nextSibling;
20
21// 次のノードが存在すれば、そのノード名を出力します。
22if ($next instanceof \Dom\Notation) {
23    echo $next->nodeName; // "notation2"
24}
25
26?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

Dom\Node|null

現在のノードの直後に続く兄弟ノードを返します。兄弟ノードが存在しない場合は、nullを返します。

サンプルコード

PHP DOM nextSiblingで兄弟ノードを取得する

1<?php
2
3declare(strict_types=1);
4
5/**
6 * Dom\NotationのnextSiblingプロパティの使用例を示します。
7 *
8 * nextSiblingは、現在のノードの直後にある兄弟ノードを取得する読み取り専用プロパティです。
9 * この例では、DTD(文書型定義)内の最初の記法(Notation)ノードを取得し、
10 * そのnextSiblingプロパティを使って次の記法ノードを取得します。
11 */
12function showNotationNextSiblingExample(): void
13{
14    // DTD内で複数の記法(NOTATION)を宣言したXML文字列を定義します。
15    // これにより、記法ノードが兄弟として隣接して配置されます。
16    $xmlString = <<<XML
17<?xml version="1.0" encoding="UTF-8"?>
18<!DOCTYPE root [
19    <!NOTATION jpeg SYSTEM "image/jpeg">
20    <!NOTATION gif SYSTEM "image/gif">
21    <!NOTATION png SYSTEM "image/png">
22]>
23<root />
24XML;
25
26    // DOMDocumentオブジェクトを作成し、XMLを読み込みます。
27    $dom = new DOMDocument();
28    $dom->loadXML($xmlString);
29
30    // DTDを表すDocumentTypeノードを取得します。
31    // 記法(Notation)はDocumentTypeノードの子ノードとして含まれます。
32    $doctype = $dom->doctype;
33    if ($doctype === null) {
34        echo "DTD (DOCTYPE) が見つかりませんでした。" . PHP_EOL;
35        return;
36    }
37
38    // 最初の記法ノード('jpeg')を取得します。
39    // $doctype->notations は Dom\NamedNodeMap オブジェクトです。
40    $firstNotation = $doctype->notations->item(0);
41
42    if ($firstNotation instanceof \Dom\Notation) {
43        echo "最初の記法ノード名: " . $firstNotation->nodeName . PHP_EOL;
44
45        // nextSiblingプロパティを使い、次の兄弟ノード('gif')を取得します。
46        $secondNotation = $firstNotation->nextSibling;
47
48        // 次の兄弟ノードが存在し、それがDom\Notationインスタンスか確認します。
49        if ($secondNotation instanceof \Dom\Notation) {
50            echo "nextSiblingで取得したノード名: " . $secondNotation->nodeName . PHP_EOL;
51        } elseif ($secondNotation === null) {
52            // 最後のノードのnextSiblingはnullになります。
53            echo "次の兄弟ノードはありません。" . PHP_EOL;
54        } else {
55            // ノード間に空白などがあるとテキストノードとして解釈される場合があります。
56            echo "次の兄弟ノードは記法ノードではありませんでした。Node Type: " . $secondNotation->nodeType . PHP_EOL;
57        }
58    } else {
59        echo "記法ノードが見つかりませんでした。" . PHP_EOL;
60    }
61}
62
63// 関数を実行して結果を表示します。
64showNotationNextSiblingExample();
65

このPHPコードは、Dom\Notationクラスが持つnextSiblingプロパティの具体的な使い方を示しています。nextSiblingは、XML文書の構造上、現在のノードと同じ階層にあり、かつ直後に存在するノード(兄弟ノード)を取得するための読み取り専用プロパティです。このプロパティに引数はありません。

サンプルコードでは、まずDTD(文書型定義)内にjpeggifpngという3つの隣接した記法(Notation)を定義したXMLデータを用意します。DOMDocumentでこのXMLを解析した後、最初の記法ノードであるjpegを取得します。

次に、このjpegノードに対してnextSiblingプロパティを呼び出すことで、そのすぐ隣にある兄弟ノード、すなわちgifノードを取得しています。コードの実行結果では、nextSiblingによって正しく次のノード名が表示されることが確認できます。

このプロパティの戻り値は、次の兄弟ノードが存在すればそのノードを表すDom\Nodeオブジェクト、存在しない場合(現在のノードが最後の場合)はnullとなります。このようにnextSiblingプロパティを利用することで、特定のノードから同じ階層のノードを順番に辿っていく処理を実装できます。

nextSiblingプロパティは、現在のノードの直後にある兄弟ノードを取得する際に使用します。注意点として、取得されるノードは常に期待する要素とは限りません。XML内の改行や空白はテキストノードとして解釈されることがあるため、取得したノードが意図した型(例: Dom\Notation)であるかをinstanceofで確認することが重要です。また、現在のノードが最後の兄弟ノードである場合、nextSiblingnullを返します。nullが返る可能性を考慮せずに処理を続けるとエラーの原因になるため、必ずnullチェックを行ってください。このプロパティは読み取り専用であり、値を代入してDOM構造を変更することはできません。

関連コンテンツ

関連プログラミング言語