【PHP8.x】Dom\Entity::removeChild()メソッドの使い方
removeChildメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
removeChildメソッドは、ノードから指定した子ノードを削除する処理を実行するメソッドです。このメソッドを呼び出すと、XMLやHTML文書の構造を表すDOMツリーから、特定の子ノードが取り除かれます。引数には、削除したい子ノードを表すDom\Nodeオブジェクトをひとつ指定します。ここで指定するノードは、メソッドを呼び出しているノードの直接の子でなければなりません。処理が成功すると、削除されたノードオブジェクトが戻り値として返されます。DOMツリーから削除された後も、このノードはメモリ上に存在し続けるため、返された値を別の変数に代入しておけば、後で文書の他の場所に挿入するなど再利用することが可能です。もし引数で指定したノードが子ノードのリストに存在しない場合、DOMExceptionという例外が発生し、不正な操作として処理が停止します。このように、removeChildメソッドは、文書構造を動的に変更する際に、不要な要素を安全に削除するために使用されます。
構文(syntax)
1<?php 2 3// 解析するXMLを準備 4$xml = <<<XML 5<?xml version="1.0" encoding="utf-8"?> 6<!DOCTYPE root [ 7 <!ENTITY myEntity "<child1>text</child1><child2/>"> 8]> 9<root/> 10XML; 11 12// DOMDocumentオブジェクトを作成 13$doc = new DOMDocument(); 14$doc->loadXML($xml); 15 16// 'myEntity' という名前の Dom\Entity オブジェクトを取得 17/** @var Dom\Entity $entity */ 18$entity = $doc->doctype->entities->getNamedItem('myEntity'); 19 20// 削除対象の子ノード (<child1>text</child1>) を取得 21/** @var Dom\Node $childNode */ 22$childNode = $entity->firstChild; 23 24// Dom\Entity オブジェクトから指定した子ノードを削除 25// public Dom\Node|false Dom\Entity::removeChild(Dom\Node $child) 26$removedNode = $entity->removeChild($childNode); 27 28?>
引数(parameters)
Dom\Node $child
- Dom\Node $child: 削除したい子ノードを指定するDom\Nodeオブジェクト
戻り値(return)
Dom\Node
このメソッドは、子ノードが正常に削除された場合に、削除された子ノードのDom\Nodeオブジェクトを返します。
サンプルコード
PHP DOM removeChildで要素を削除する
1<?php 2 3/** 4 * DOM要素から特定の子要素を削除するサンプル関数 5 * 6 * この関数は、指定されたIDを持つ親要素から、 7 * 同じく指定されたIDを持つ子要素を削除する方法を示します。 8 */ 9function removeDomChildElement(): void 10{ 11 // 操作対象となるHTML文字列を定義 12 $html = <<<HTML 13 <!DOCTYPE html> 14 <html lang="ja"> 15 <head> 16 <meta charset="UTF--8"> 17 <title>DOM removeChild Example</title> 18 </head> 19 <body> 20 <h1>リスト</h1> 21 <ul id="list-container"> 22 <li id="item-1">アイテム1</li> 23 <li id="item-2">削除されるアイテム</li> 24 <li id="item-3">アイテム3</li> 25 </ul> 26 </body> 27 </html> 28 HTML; 29 30 // DOMDocumentオブジェクトを作成し、HTMLを読み込む 31 $dom = new DOMDocument(); 32 // HTMLのパースエラーを抑制するため、内部エラー処理を有効化 33 libxml_use_internal_errors(true); 34 $dom->loadHTML($html); 35 libxml_clear_errors(); 36 37 // 親要素 (ul#list-container) をIDで取得 38 $parentElement = $dom->getElementById('list-container'); 39 40 // 削除対象の子要素 (li#item-2) をIDで取得 41 $childToRemove = $dom->getElementById('item-2'); 42 43 // 親要素と子要素が両方存在する場合のみ処理を実行 44 if ($parentElement !== null && $childToRemove !== null) { 45 echo "--- 削除前のHTML ---" . PHP_EOL; 46 // 親要素のHTMLを出力して削除前の状態を確認 47 echo $dom->saveHTML($parentElement) . PHP_EOL; 48 49 // removeChildメソッドで子要素を削除 50 // このメソッドは削除したノードを返す 51 $removedNode = $parentElement->removeChild($childToRemove); 52 53 echo "--- 削除後のHTML ---" . PHP_EOL; 54 // 親要素のHTMLを出力して削除後の状態を確認 55 echo $dom->saveHTML($parentElement) . PHP_EOL; 56 57 echo "--- 削除されたノードの情報 ---" . PHP_EOL; 58 // 戻り値として受け取った削除済みノードの情報を出力 59 echo "タグ名: " . $removedNode->nodeName . PHP_EOL; 60 echo "テキスト内容: " . $removedNode->textContent . PHP_EOL; 61 } else { 62 echo "指定されたIDの要素が見つかりませんでした。" . PHP_EOL; 63 } 64} 65 66// 関数を実行 67removeDomChildElement(); 68
Dom\Entity::removeChildメソッドは、DOMツリー(文書の構造)から特定の子ノードを削除するために使用されます。
このサンプルコードでは、まずDOMDocumentクラスを使ってHTML文字列を解析し、PHPで操作可能なオブジェクトを生成します。次にgetElementByIdメソッドを利用して、親要素である<ul>タグと、その中から削除したい子要素である<li>タグをそれぞれ取得しています。
removeChildメソッドは、親要素のオブジェクトから呼び出します。引数には、削除したい子ノードのオブジェクトを指定します。このサンプルでは、$parentElementから$childToRemoveを削除しています。メソッドが実行されると、親要素から指定された子要素がDOM構造から取り除かれ、HTMLが変更されます。
このメソッドの戻り値は、削除されたノードオブジェクトそのものです。これにより、削除した要素を後で別の場所に移動させたり、内容を確認したりすることが可能です。サンプルコードでは、戻り値を$removedNode変数に受け取り、削除されたノードのタグ名やテキスト内容を出力して確認しています。
removeChildメソッドは、指定した子要素を削除する際に使用します。注意点として、このメソッドは親要素の「直接の子」である要素しか削除できません。例えば、祖父要素から孫要素を直接削除しようとするとエラーになります。また、削除対象の親要素や子要素が見つからない状態でメソッドを呼び出すとエラーが発生するため、サンプルコードのように事前にnullでないことを確認する処理は、安全なプログラムのために不可欠です。このメソッドは、削除した要素そのものを戻り値として返します。返された要素はドキュメントから切り離された状態ですが、変数で受け取ることで内容を確認したり、別の場所へ移動させたりすることも可能です。