【PHP8.x】DOMNotation::firstChildプロパティの使い方
firstChildプロパティの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
firstChildプロパティは、DOMNotationクラスのインスタンスにおいて、そのノードの最初の子ノードを保持するプロパティです。
DOMNotationクラスは、XMLドキュメント型定義(DTD)内で宣言される表記法(NOTATION)を表します。表記法とは、XML文書内で使用される特定のデータ形式(例えば、画像ファイルや外部アプリケーションで処理されるデータなど)を識別し、それに関連付けられたアプリケーションを示すために使われる宣言です。
一般的に、DOM(Document Object Model)ツリー内のノードは、子ノードを持つことがあります。firstChildプロパティは、そのような親ノードが持つ最初の子ノードを取得するために設計されています。しかしながら、DOMNotationオブジェクトは、その性質上、子ノードを持つことはありません。表記法自体が、XMLドキュメントの構造の一部として子要素を持つ概念とは異なるためです。
このため、DOMNotationインスタンスのfirstChildプロパティにアクセスした場合、常にnullが返されます。これは、DOMの仕様において、特定のノードが子要素を持たない場合に、そのノードのfirstChildプロパティがnullを返すという標準的な挙動に則っています。システムエンジニアとしてXMLドキュメントの処理を行う際には、このような特定のノードタイプが持つプロパティの特性を理解しておくことが重要です。これにより、意図しないエラーを防ぎ、より堅牢なプログラムを作成することができます。
構文(syntax)
1<?php 2 3$xml = '<!DOCTYPE example [<!NOTATION image SYSTEM "image/jpeg">]><root/>'; 4$dom = new DOMDocument(); 5$dom->loadXML($xml); 6 7$domNotationObject = $dom->doctype->notations->getNamedItem('image'); 8 9$firstChild = $domNotationObject->firstChild;
引数(parameters)
引数なし
引数はありません
戻り値(return)
DOMNode|null
DOMNotationオブジェクトの最初の子ノードをDOMNodeオブジェクトとして返します。子ノードが存在しない場合はnullを返します。
サンプルコード
PHP DOMDocument firstChild で最初の子ノードを取得する
1<?php 2 3/** 4 * DOMDocumentとfirstChildプロパティを使用して、 5 * 指定した要素の最初の子ノードを取得するサンプルです。 6 */ 7function getFirstChildNodeExample(): void 8{ 9 // 操作対象となるシンプルなXML文字列を定義します。 10 $xmlString = <<<XML 11 <?xml version="1.0" encoding="UTF-8"?> 12 <book> 13 <title>PHPマスターへの道</title> 14 <author>侍エンジニア</author> 15 <year>2023</year> 16 </book> 17 XML; 18 19 // DOMDocumentオブジェクトをインスタンス化します。 20 $dom = new DOMDocument(); 21 22 // 空白のテキストノードを無視する設定を行います。 23 // これをfalseにしないと、要素間の改行やインデントが 24 // テキストノードとして扱われ、意図しないノードが取得されることがあります。 25 $dom->preserveWhiteSpace = false; 26 27 // XML文字列をロードします。 28 $dom->loadXML($xmlString); 29 30 // XMLのルート要素 (<book>) を取得します。 31 $bookElement = $dom->documentElement; 32 33 // firstChildプロパティを使い、<book>要素の最初の子ノードを取得します。 34 // このXMLの場合、<title>要素が取得されます。 35 // 子ノードが存在しない場合は null が返ります。 36 $firstChild = $bookElement->firstChild; 37 38 // 取得したノードがnullでないことを確認します。 39 if ($firstChild !== null) { 40 // 取得したノードの名前('title')と、そのノードが持つテキストコンテンツを出力します。 41 echo 'ノード名: ' . $firstChild->nodeName . PHP_EOL; // 出力: ノード名: title 42 echo 'テキスト: ' . $firstChild->textContent . PHP_EOL; // 出力: テキスト: PHPマスターへの道 43 } else { 44 echo '最初の子ノードは見つかりませんでした。' . PHP_EOL; 45 } 46} 47 48// 関数を実行します。 49getFirstChildNodeExample();
firstChildは、特定のXML/HTML要素(ノード)の直下にある、最初の子ノードを取得するためのプロパティです。このプロパティは値を取得するだけで、引数を指定する必要はありません。
サンプルコードでは、まずDOMDocumentオブジェクトを利用してXMLデータを解析しています。ここで重要なのが$dom->preserveWhiteSpace = false;という設定です。この設定を行わないと、要素間の改行やインデントなどもテキストノードとして認識され、意図しないノードが最初の子ノードとして取得されてしまう可能性があるためです。
次に、XML全体のルート要素である<book>を取得し、その要素に対してfirstChildプロパティを呼び出しています。これにより、<book>要素の最初の子要素である<title>要素が取得されます。
このプロパティの戻り値は、子ノードが存在する場合はそのノードを表すDOMNodeオブジェクト、子ノードが一つも存在しない場合はnullとなります。そのため、取得した値を利用する前には、if文などを使ってnullでないことを確認するのが安全な実装方法です。コードの最後では、取得したノードのノード名(title)とテキスト内容を画面に出力しています。
firstChildプロパティを利用する際の注意点は、要素間の改行やインデントがテキストノードとして扱われる可能性があることです。意図しない空白ノードの取得を防ぐため、XMLを読み込む前に$dom->preserveWhiteSpace = false;を設定することが重要です。また、このプロパティは最初の子「要素」だけでなく、テキストやコメントを含む最初の「ノード」を返します。子ノードが存在しない場合はnullが返るため、取得した変数を利用する前には必ずnullチェックを行い、エラーの発生を防ぐようにしてください。