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

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

作成日: 更新日:

基本的な使い方

nextSiblingプロパティは、Dom\XMLDocumentクラスに属し、現在のノードの次に位置する兄弟ノードを保持するプロパティです。ここでいう「兄弟ノード」とは、同じ親要素を持つノードのうち、現在のノードの直後に続くノードを指します。

Dom\XMLDocumentクラスは、XMLドキュメント全体を表す特別なノードです。XMLドキュメントは通常、すべての要素の最上位に位置する単一のルート要素を持つため、ドキュメントノード自体が他のノードの兄弟として存在することは極めて稀です。そのため、Dom\XMLDocumentオブジェクトのnextSiblingプロパティにアクセスしても、ほとんどの場合、次に続く兄弟ノードが存在しないことを示すnullが返されます。

このプロパティは、DOM(Document Object Model)の設計において、すべてのノードが共通して持つ基本的な属性の一つとして提供されています。しかし、その主な用途は、XMLドキュメント内部の具体的な要素ノードやテキストノードなど、階層構造の中に存在するノードを操作する際に、隣接するノードへの効率的なアクセスを可能にすることにあります。

システムエンジニアとしてXMLドキュメントを扱う際には、このnextSiblingプロパティが、ノードリストを順に走査する際や、特定のノードに続く情報を取得する際に非常に役立つことを理解しておくことが重要です。Dom\XMLDocumentのインスタンスでは、通常nullを返す点に注意しつつ、より具体的な要素ノードなどで利用することを想定してください。

構文(syntax)

1<?php
2
3// Dom\Document クラスを使用してXMLドキュメントを作成します。
4// Dom\XMLDocument というクラスはPHP標準にはありませんが、Dom\Document がXML文書を扱います。
5$doc = new Dom\Document();
6$doc->loadXML('<root><item1/><item2/></root>');
7
8// ルート要素の子ノードである <item1> を取得します。
9// これは Dom\Element (Dom\Nodeを継承) のインスタンスです。
10$node = $doc->documentElement->firstChild;
11
12// ノードの次の兄弟ノードを取得します。
13// この場合、<item1> の次の兄弟ノードである <item2> が取得されます。
14$nextSiblingNode = $node->nextSibling;
15
16// 取得したノードが存在すれば、そのノード名を出力します。
17if ($nextSiblingNode !== null) {
18    echo $nextSiblingNode->nodeName; // 出力: item2
19}
20
21?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

?Dom\Node

指定されたXMLノードの次の兄弟ノードを返します。次の兄弟ノードが存在しない場合は、nullを返します。

サンプルコード

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

1<?php
2
3// XML ドキュメントをロードします。
4$dom = new DOMDocument();
5$dom->loadXML('<root><child1/><child2/><child3/></root>');
6
7// child1 要素を取得します。
8$child1 = $dom->documentElement->firstChild;
9
10// nextSibling を使用して次の兄弟ノードを取得します。
11$nextSibling = $child1->nextSibling;
12
13// 次の兄弟ノードの名前を表示します。
14if ($nextSibling !== null) {
15    echo $nextSibling->nodeName . PHP_EOL; // 出力: child2
16} else {
17    echo "次の兄弟ノードはありません。" . PHP_EOL;
18}
19
20// child2 要素を取得します。
21$child2 = $nextSibling;
22
23// さらに次の兄弟ノードを取得します。
24$nextNextSibling = $child2->nextSibling;
25
26// さらに次の兄弟ノードの名前を表示します。
27if ($nextNextSibling !== null) {
28    echo $nextNextSibling->nodeName . PHP_EOL; // 出力: child3
29} else {
30    echo "次の兄弟ノードはありません。" . PHP_EOL;
31}
32
33// child3 要素を取得します。
34$child3 = $nextNextSibling;
35
36// さらに次の兄弟ノードを取得します。
37$nextNextNextSibling = $child3->nextSibling;
38
39// さらに次の兄弟ノードの名前を表示します。
40if ($nextNextNextSibling !== null) {
41    echo $nextNextNextSibling->nodeName . PHP_EOL;
42} else {
43    echo "次の兄弟ノードはありません。" . PHP_EOL; // 出力: 次の兄弟ノードはありません。
44}
45
46?>

PHP 8 の Dom\XMLDocument クラスにおける nextSibling プロパティは、あるノードの直後にある兄弟ノードを取得するために使用します。兄弟ノードとは、同じ親ノードを持つノードのことです。

このサンプルコードでは、まず XML ドキュメントを DOMDocument オブジェクトとしてロードしています。次に、firstChild プロパティを使って最初の child 要素(child1)を取得します。nextSibling プロパティを使用すると、child1 の次の兄弟ノード(child2)を取得できます。

nextSibling プロパティは、次の兄弟ノードが存在する場合は Dom\Node オブジェクトを返し、存在しない場合は null を返します。サンプルコードでは、取得したノードが null かどうかをチェックし、null でない場合はそのノードの名前(nodeName プロパティ)を出力します。child2child3に対しても同様の処理を繰り返し、次の兄弟ノードが存在しない場合に null が返されることを確認しています。

このように nextSibling プロパティを使用することで、XML ドキュメント内の兄弟ノードを順番に辿っていくことが可能です。XML データを解析し、特定の条件を満たすノードを見つけ出すような場合に役立ちます。

nextSiblingは、指定されたノードの直後の兄弟ノードを取得するメソッドです。兄弟ノードが存在しない場合、nullを返します。

nullチェックを必ず行ってください。兄弟ノードが存在しない場合にnullが返ってくるため、nullに対してノードのプロパティ(nodeNameなど)にアクセスしようとするとエラーが発生します。if ($nextSibling !== null)のように、nullでないことを確認してからプロパティにアクセスするようにしましょう。

XML構造によっては、テキストノード(空白など)も兄弟ノードとして認識される場合があります。意図しないノードを取得しないように、nodeTypeプロパティでノードの種類をチェックすると良いでしょう。nextSiblingは、ノードが存在しない場合にnullを返すため、ループ処理の終了条件としても利用できます。

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