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

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

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

作成日: 更新日:

基本的な使い方

nextSiblingプロパティは、DOMツリー内における現在の処理命令ノードの直後にある兄弟ノードを保持するプロパティです。DOMの階層構造において、同じ親ノードを持つノード同士を兄弟ノードと呼びます。このプロパティにアクセスすると、現在の処理命令ノードのすぐ隣に存在するノードが、存在すればDOMNodeオブジェクトとして返されます。もし現在のノードが親ノードの持つ子ノードの中で最後のものであり、直後に兄弟ノードが存在しない場合には、このプロパティは null を返します。この null を返す仕様は、特定のノードから後続の兄弟ノードをすべて順番に処理するような繰り返し処理を実装する際に、ループの終了条件として利用することが可能です。このプロパティは読み取り専用であり、値を取得することのみができます。したがって、このプロパティに別のノードを代入してDOM構造を直接変更することはできません。XML文書などを操作する際に、特定の処理命令の後に続く要素を順次たどるために使用されます。

構文(syntax)

1<?php
2
3$xmlString = '<?xml version="1.0"?><root><?pi-target pi-data?><element/></root>';
4
5$doc = new DOMDocument();
6$doc->loadXML($xmlString);
7
8// DOMProcessingInstructionノードを取得
9$processingInstruction = $doc->documentElement->firstChild;
10
11// 構文: $domProcessingInstruction->nextSibling
12// 処理命令ノードの次の兄弟ノードを取得します
13$nextNode = $processingInstruction->nextSibling;
14
15// 次の兄弟ノード(<element/>)の名前を出力します
16echo $nextNode->nodeName; // "element" が出力されます
17
18?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

DOMNode|null

DOMProcessingInstructionクラスのnextSiblingプロパティは、現在のProcessingInstructionノードの次にある兄弟ノードを返します。もし次にある兄弟ノードが存在しない場合は、nullを返します。

サンプルコード

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

1<?php
2
3declare(strict_types=1);
4
5/**
6 * DOMProcessingInstructionのnextSiblingプロパティの使用例を示します。
7 *
8 * XMLドキュメント内の処理命令ノードを取得し、
9 * その直後にある兄弟ノード(nextSibling)の情報を出力します。
10 */
11function showDomProcessingInstructionNextSibling(): void
12{
13    // 処理命令 (`<?...?>`) を含むXML文字列を定義します。
14    $xmlString = <<<XML
15    <?xml version="1.0" encoding="UTF-8"?>
16    <root>
17      <item>First Item</item>
18      <?php-app-target data="process-this"?>
19      <item>Second Item</item>
20      <last>Last Item</last>
21    </root>
22    XML;
23
24    // DOMDocumentオブジェクトを作成し、XMLを読み込みます。
25    $dom = new DOMDocument();
26
27    // preserveWhiteSpaceをfalseに設定すると、整形用の空白テキストノードが無視され、
28    // ノード間の移動が直感的になります。
29    $dom->preserveWhiteSpace = false;
30    $dom->loadXML($xmlString);
31
32    // XPathを使用して、特定の処理命令ノード(`php-app-target`)を取得します。
33    $xpath = new DOMXPath($dom);
34    /** @var DOMNodeList $piNodes */
35    $piNodes = $xpath->query('//processing-instruction("php-app-target")');
36
37    // 処理命令ノードが存在するか確認します。
38    if ($piNodes->length > 0) {
39        /** @var DOMProcessingInstruction $piNode */
40        $piNode = $piNodes->item(0);
41
42        echo '■ 基準となる処理命令ノード' . PHP_EOL;
43        echo 'ターゲット名: ' . $piNode->target . PHP_EOL; // "php-app-target"
44        echo 'データ: ' . $piNode->data . PHP_EOL; // "data="process-this""
45        echo '---' . PHP_EOL;
46
47        // nextSiblingプロパティを使用して、次の兄弟ノードを取得します。
48        // このXMLでは、<item>Second Item</item> 要素が取得されます。
49        $next = $piNode->nextSibling;
50
51        // 取得した兄弟ノードの情報を出力します。
52        if ($next instanceof DOMNode) {
53            echo '■ nextSibling で取得したノードの情報' . PHP_EOL;
54            echo 'ノード名: ' . $next->nodeName . PHP_EOL;    // "item"
55            echo 'ノード値: ' . $next->nodeValue . PHP_EOL; // "Second Item"
56        } else {
57            // ノードがドキュメントの最後にある場合など、次の兄弟がない場合はnullになります。
58            echo '次の兄弟ノードはありません。' . PHP_EOL;
59        }
60    } else {
61        echo '指定された処理命令ノードが見つかりませんでした。' . PHP_EOL;
62    }
63}
64
65// 関数を実行して結果を表示します。
66showDomProcessingInstructionNextSibling();

DOMProcessingInstructionクラスのnextSiblingプロパティは、XMLドキュメント内のある処理命令ノードを基準として、その直後にある兄弟ノードを取得するために使用します。このプロパティは引数を必要としません。

サンプルコードでは、まず<?php-app-target data="process-this"?>という処理命令ノードを特定しています。次に、このノードに対してnextSiblingプロパティを呼び出すことで、すぐ隣に位置する兄弟ノードを探し出します。このXMLの構造上、処理命令ノードの次には<item>Second Item</item>という要素ノードが存在するため、この要素ノードが取得されます。最終的に、取得したノードのノード名(item)とノード値(Second Item)が出力されます。

nextSiblingプロパティの戻り値は、次の兄弟ノードが見つかった場合はそのノードを表すDOMNodeオブジェクト、見つからなかった場合はnullとなります。基準となるノードが最後の兄弟ノードである場合などがこれに該当します。そのため、コードでは取得した値がnullでないことを確認してからノードの情報を参照しており、エラーを未然に防ぐ安全な実装となっています。

nextSiblingプロパティは、現在のノードのすぐ次にある兄弟ノードを取得します。注意点として、XMLを読み込む際に$dom->preserveWhiteSpace = false;を設定することが重要です。これを設定しないと、コードの見た目を整えるための改行や空白がテキストノードとして扱われ、予期しないノードが取得されることがあります。また、nextSiblingは次の兄弟ノードがない場合にnullを返します。取得した値を使う前には必ずnullでないかを確認してください。このチェックを怠ると、nullに対して操作しようとしてエラーが発生する原因となります。

関連コンテンツ

関連プログラミング言語