【PHP8.x】DOMNamedNodeMap::getNamedItem()メソッドの使い方
getNamedItemメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
getNamedItemメソッドは、DOMNamedNodeMapオブジェクトの中から指定した名前のノードを取得するために使用するメソッドです。DOMNamedNodeMapは、XML文書やHTML文書における要素の属性の集まりを表すコレクションです。例えば、あるHTML要素が持つidやclassといった複数の属性は、このDOMNamedNodeMapオブジェクトとして管理されます。このメソッドは、引数に属性名などのノード名を文字列として渡すことで、その名前を持つノードをコレクション内から探し出します。指定された名前のノードが見つかった場合は、そのノードを表すDOMNodeオブジェクト(通常はDOMAttrオブジェクト)を返します。一方、コレクション内に該当する名前のノードが存在しなかった場合には、nullを返します。このため、メソッドの実行結果を変数に受け取った後、その変数がnullでないことを確認してから後続の処理を行うことが重要です。このメソッドにより、特定の属性の存在確認や、属性ノード自体の取得を簡単に行うことができます。
構文(syntax)
1<?php 2 3$document = new DOMDocument(); 4$document->loadHTML('<p id="p1" class="main">Hello</p>'); 5 6// <p> 要素の DOMElement を取得 7$element = $document->getElementsByTagName('p')->item(0); 8 9// 要素の属性リスト (DOMNamedNodeMap) を取得 10$attributes = $element->attributes; 11 12// 'id' という名前の属性ノード (DOMAttr) を取得 13// public DOMNamedNodeMap::getNamedItem(string $qualifiedName): ?DOMNode 14$idNode = $attributes->getNamedItem('id'); 15 16// 取得した属性ノードの値を出力 17if ($idNode !== null) { 18 echo $idNode->value; // "p1" が出力される 19} 20 21?>
引数(parameters)
string $qualifiedName
- string $qualifiedName: 検索する属性の名前を指定する文字列
戻り値(return)
?DOMNode
指定された名前と一致する属性ノードを返します。一致するノードが見つからない場合は null を返します。
サンプルコード
PHP: DOMNamedNodeMap::getNamedItemで属性名から属性を取得する
1<?php 2 3/** 4 * DOMNamedNodeMap::getNamedItem メソッドの使用例を示します。 5 * このメソッドは、DOMNamedNodeMap (属性ノードの集合) から指定された名前の属性ノードを取得します。 6 * システムエンジニアを目指す初心者向けに、XML ドキュメントの要素から属性を取得する基本的な流れを説明します。 7 */ 8function demonstrateDomNamedNodeMapGetNamedItem(): void 9{ 10 // 1. 新しい DOMDocument オブジェクトを作成 11 // XML ドキュメントを操作するための基盤となります。 12 $dom = new DOMDocument('1.0', 'UTF-8'); 13 $dom->preserveWhiteSpace = false; // 不要な空白を除去 14 $dom->formatOutput = true; // 整形されたXML出力 15 16 // 2. ルート要素 'data' を作成し、ドキュメントに追加 17 $root = $dom->createElement('data'); 18 $dom->appendChild($root); 19 20 // 3. 子要素 'product' を作成し、複数の属性を追加 21 $product = $dom->createElement('product'); 22 $product->setAttribute('id', 'P001'); 23 $product->setAttribute('name', 'Sample Widget'); 24 $product->setAttribute('category', 'Electronics'); 25 $product->setAttribute('price', '99.99'); 26 $root->appendChild($product); 27 28 echo "--- 属性ノードの取得と表示 --- \n"; 29 30 // 4. 'product' 要素から属性の集合 (DOMNamedNodeMap) を取得 31 // DOMElement の 'attributes' プロパティは DOMNamedNodeMap オブジェクトを返します。 32 $attributes = $product->attributes; 33 34 // DOMNamedNodeMap が存在するかを確認 (要素に属性がなくても null にはならないが、念のため) 35 if ($attributes === null) { 36 echo "指定された要素には属性がありません。\n"; 37 return; 38 } 39 40 // 5. getNamedItem() メソッドを使用して、特定の名前の属性ノードを取得 41 // 引数には、取得したい属性の正確な名前 (qualifiedName) を文字列で指定します。 42 43 // 例1: 'name' 属性を取得 44 $nameAttribute = $attributes->getNamedItem('name'); 45 46 if ($nameAttribute instanceof DOMNode) { // DOMNode 型であることを確認 47 echo "属性 'name':\n"; 48 echo " ノード名: " . $nameAttribute->nodeName . "\n"; // 属性名 ('name') 49 echo " ノード値: " . $nameAttribute->nodeValue . "\n"; // 属性値 ('Sample Widget') 50 } else { 51 echo "属性 'name' は見つかりませんでした。\n"; 52 } 53 54 echo "\n"; 55 56 // 例2: 'id' 属性を取得 57 $idAttribute = $attributes->getNamedItem('id'); 58 59 if ($idAttribute instanceof DOMNode) { 60 echo "属性 'id':\n"; 61 echo " ノード名: " . $idAttribute->nodeName . "\n"; 62 echo " ノード値: " . $idAttribute->nodeValue . "\n"; 63 } else { 64 echo "属性 'id' は見つかりませんでした。\n"; 65 } 66 67 echo "\n"; 68 69 // 例3: 存在しない属性 'material' を取得しようとすると null が返されます 70 $nonExistentAttribute = $attributes->getNamedItem('material'); 71 72 if ($nonExistentAttribute === null) { 73 echo "属性 'material' は見つかりませんでした (null が返されました)。\n"; 74 } 75} 76 77// 関数を実行して、DOMNamedNodeMap::getNamedItem の動作を確認 78demonstrateDomNamedNodeMapGetNamedItem();
PHP 8のDOMNamedNodeMap::getNamedItemメソッドは、XMLドキュメントをプログラムで操作する際に、特定の名前を持つ属性の情報を効率的に取得するために使用されます。このメソッドは、HTMLやXML要素が持つ属性の集合を表すDOMNamedNodeMapオブジェクトから呼び出します。
引数には、取得したい属性の正確な名前を文字列$qualifiedNameとして渡します。例えば、XML要素の「id」属性や「name」属性の値を取り出したい場合に、それぞれの属性名を指定します。
戻り値は、指定された名前の属性が要素内で見つかった場合、その属性を表すDOMNodeオブジェクトを返します。このDOMNodeオブジェクトからは、nodeNameプロパティで属性名、nodeValueプロパティで属性値を取得できます。もし、指定した名前の属性が要素に見つからなかった場合は、nullが返されます。
サンプルコードでは、まずDOMDocumentを作成し、product要素に「id」や「name」などの複数の属性を追加しています。次に、product要素のattributesプロパティを通じて属性の集合(DOMNamedNodeMap)を取得し、その集合に対してgetNamedItem('name')やgetNamedItem('id')を呼び出して、特定の属性ノードを取得しています。取得した属性ノードから、その名前と値を出力する例や、存在しない属性名「material」を指定した場合にnullが返される挙動も示しています。このメソッドは、XMLデータから必要な属性情報を柔軟に取り出す際に非常に役立ちます。
このメソッドは、指定された属性名に合致する属性ノード(DOMNodeオブジェクト)を返しますが、該当する属性が見つからない場合はnullを返します。そのため、属性のプロパティ(nodeNameやnodeValueなど)にアクセスする前に、必ず返り値がnullでないかを確認してください。if ($attribute instanceof DOMNode) のように型チェックを行うことも、安全なコードのために非常に有効です。引数として渡す属性名は、大文字・小文字を含め、XMLドキュメント内で定義されている正確な名前を指定する必要があります。誤った名前を指定すると、属性が存在しないと判断されnullが返されるため注意が必要です。また、XMLの名前空間を扱う際には、getNamedItemNSメソッドの利用もご検討ください。
DOMNamedNodeMap::getNamedItemで属性を取得する
1<?php 2 3/** 4 * DOMNamedNodeMap::getNamedItem メソッドの使用例を示します。 5 * このメソッドは、要素の属性リストから指定された名前の属性ノードを取得します。 6 */ 7function demonstrateGetNamedItem(): void 8{ 9 // 新しいDOMドキュメントを作成 10 $dom = new DOMDocument('1.0', 'UTF-8'); 11 // 出力XMLを見やすくフォーマットする設定 12 $dom->formatOutput = true; 13 14 // ルート要素 'book' を作成し、ドキュメントに追加 15 $bookElement = $dom->createElement('book'); 16 $dom->appendChild($bookElement); 17 18 // 'book' 要素にいくつかの属性を追加 19 $bookElement->setAttribute('isbn', '978-4-06-XXXXXX-X'); 20 $bookElement->setAttribute('title', 'PHP Basics'); 21 $bookElement->setAttribute('lang', 'en'); 22 23 echo "--- 属性 'isbn' を取得する例 ---\n"; 24 // 'book' 要素の属性リスト (DOMNamedNodeMap) を取得 25 $attributes = $bookElement->attributes; 26 27 // getNamedItem を使用して 'isbn' という名前の属性ノードを取得 28 // 戻り値は DOMAttr (DOMNodeのサブクラス) または null です 29 $isbnAttribute = $attributes->getNamedItem('isbn'); 30 31 // 属性が取得できたか確認し、その名前と値を出力 32 if ($isbnAttribute !== null) { 33 echo "取得した属性名: " . $isbnAttribute->name . "\n"; 34 echo "取得した属性値: " . $isbnAttribute->value . "\n"; 35 } else { 36 echo "'isbn' 属性は見つかりませんでした。\n"; 37 } 38 39 echo "\n--- 存在しない属性 'author' を取得する例 ---\n"; 40 // 存在しない属性 'author' を取得しようとする 41 $authorAttribute = $attributes->getNamedItem('author'); 42 43 // 存在しない場合は null が返されます 44 if ($authorAttribute !== null) { 45 echo "取得した属性名: " . $authorAttribute->name . "\n"; 46 echo "取得した属性値: " . $authorAttribute->value . "\n"; 47 } else { 48 echo "'author' 属性は見つかりませんでした。\n"; 49 } 50} 51 52// 関数を実行してデモンストレーションを開始 53demonstrateGetNamedItem();
DOMNamedNodeMap::getNamedItemメソッドは、XMLやHTMLなどのDOM要素が持つ属性のリスト(DOMNamedNodeMapオブジェクト)から、指定した名前の属性ノードを取得するために使用されます。
このメソッドはstring $qualifiedNameという引数を取り、取得したい属性の名前を文字列で指定します。例えば「id」や「class」といった属性名を渡します。
戻り値は?DOMNode型で、指定した名前の属性が見つかった場合は、その属性を表すDOMNodeのサブクラス(具体的にはDOMAttrオブジェクト)を返します。属性が見つからなかった場合はnullを返します。
サンプルコードでは、まず新しいDOMDocumentを作成し、bookという要素にisbn、title、langの三つの属性を追加しています。次に、$bookElement->attributesでbook要素の属性リストであるDOMNamedNodeMapを取得します。
$attributes->getNamedItem('isbn')とすることで、isbnという名前の属性ノードを取得し、その名前と値を出力しています。属性が存在するため、正しく情報が表示されます。
一方、$attributes->getNamedItem('author')では、存在しないauthor属性を取得しようとしています。この場合、メソッドはnullを返すため、属性が見つからなかった旨のメッセージが表示されることを確認できます。これにより、属性の有無に応じた処理を実装する方法が理解できます。
getNamedItemメソッドは、指定した属性が見つからない場合、nullを返します。そのため、必ずnullチェックを行い、返された値がnullではないことを確認してから、属性の名前や値にアクセスしてください。nullのままアクセスしようとするとエラーが発生します。また、引数に渡す属性名は、大文字・小文字を区別して正確に記述する必要があります。スペルミスや大文字・小文字の違いがあると、属性が存在していても見つからないと判断されnullが返されますので注意が必要です。このメソッドは要素の属性リスト(DOMNamedNodeMap)に対して使用します。