【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に対して操作しようとしてエラーが発生する原因となります。