【PHP8.x】Dom\Document::nodeTypeプロパティの使い方
nodeTypeプロパティの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
nodeTypeプロパティは、DOM (Document Object Model) におけるノードの種類を識別するための整数値を保持するプロパティです。PHPのDom\Documentクラスは、XMLやHTMLなどのマークアップ言語で記述された文書全体を表現するオブジェクトです。
このDom\DocumentオブジェクトのnodeTypeプロパティは、常に文書全体を表す「文書ノード」であることを示す特定の値(例えば、XML_DOCUMENT_NODE定数で表される値)を返します。これは、Dom\Documentオブジェクトが文書構造の最上位、つまり文書そのものを表すためです。
システムエンジニアを目指す方にとって、このnodeTypeプロパティは、DOMツリーをプログラムで走査し、各ノードの種類を判別する上で重要な手段です。Dom\Documentオブジェクトでは、このプロパティで文書全体のルートノードであることを確認できます。DOM操作においてノードの種類に応じた処理を行う際、nodeTypeは基本的な判別基準として活用されます。
構文(syntax)
1<?php 2 3$document = new \Dom\Document(); 4 5// プロパティの値を取得します 6$type = $document->nodeType; 7 8var_dump($type); 9 10?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
DOMNode::nodeType を参照して判断します。
<?php
$dom = new DomDocument;
echo $dom->nodeType;
?>
上記コードを実行すると数値が出力されることから、戻り値は 戻り値なし ではありません。
<?php
libxml_use_internal_errors(true);
$dom = new DomDocument();
$dom->loadHTML('<!DOCTYPE html><html><body><h1>My First Heading</h1><p>My first paragraph.</p></body></html>');
$node = $dom->documentElement;
echo $node->nodeType . PHP_EOL; // Outputs: 1
echo $dom->nodeType . PHP_EOL; // Outputs: 9
echo $dom->firstChild->nodeType . PHP_EOL; // Outputs: 7
nodeType は定数値を返します。
int
Dom\Document クラスの nodeType プロパティは、ノードの種類を表す整数値を返します。この整数値は、DOMNode::nodeType で定義されている定数に対応しており、例えばドキュメントノードの場合は 9、要素ノードの場合は 1、処理命令ノードの場合は 7 となります。
サンプルコード
PHP DomDocument nodeType を取得する
1<?php 2 3declare(strict_types=1); 4 5/** 6 * DOMDocumentと、それに含まれる各ノードのnodeTypeプロパティの値を確認します。 7 * 8 * nodeTypeは、そのノードがどの種類(ドキュメント、要素、テキストなど)であるかを示す整数値を返します。 9 * PHPでは、これらの数値に対応するXML_*という形式の定義済み定数が用意されています。 10 */ 11function showNodeTypeExample(): void 12{ 13 // 解析するHTML文字列を定義します。 14 $html = <<<HTML 15<!DOCTYPE html> 16<!-- ページのコメント --> 17<html> 18<body> 19 <h1>見出し</h1> 20</body> 21</html> 22HTML; 23 24 // DOMDocumentオブジェクトをインスタンス化します。 25 $dom = new DOMDocument(); 26 27 // HTML5の解釈エラーを抑制し、HTML文字列を読み込みます。 28 libxml_use_internal_errors(true); 29 $dom->loadHTML($html); 30 libxml_clear_errors(); 31 32 // 1. DOMDocumentオブジェクト自身のnodeType (ドキュメントノード) 33 // ドキュメント全体を表し、常に 9 (XML_DOCUMENT_NODE) となります。 34 echo "DOMDocument : " . $dom->nodeType . PHP_EOL; 35 36 // 2. DOCTYPE宣言のnodeType (ドキュメント型ノード) 37 // $dom->doctype プロパティから取得します。nodeTypeは 10 (XML_DOCUMENT_TYPE_NODE) です。 38 echo "<!DOCTYPE> : " . $dom->doctype->nodeType . PHP_EOL; 39 40 // 3. <html>要素のnodeType (要素ノード) 41 // $dom->documentElement プロパティはルート要素を指します。nodeTypeは 1 (XML_ELEMENT_NODE) です。 42 echo "<html> Element : " . $dom->documentElement->nodeType . PHP_EOL; 43 44 // 4. コメントのnodeType (コメントノード) 45 // <html>要素内の最初の子ノードであるコメントを取得します。nodeTypeは 8 (XML_COMMENT_NODE) です。 46 $comment = $dom->documentElement->firstChild; 47 echo "Comment : " . $comment->nodeType . PHP_EOL; 48 49 // 5. テキストのnodeType (テキストノード) 50 // <h1>要素を取得し、その中にあるテキストノードのnodeTypeを取得します。nodeTypeは 3 (XML_TEXT_NODE) です。 51 $h1 = $dom->getElementsByTagName('h1')->item(0); 52 echo "<h1> Text : " . $h1->firstChild->nodeType . PHP_EOL; 53} 54 55// 関数を呼び出してサンプルを実行します。 56showNodeTypeExample(); 57
Dom\DocumentクラスのnodeTypeプロパティは、DOMツリー内のノードがどの種類に属するかを識別するための整数値を返します。このプロパティに引数はなく、アクセスするだけで値を取得できます。
戻り値はノードの種類を示す整数です。例えば、ドキュメント全体を表すノードは9、HTMLタグのような要素ノードは1、文章などのテキストノードは3、コメントノードは8といった値が返されます。これらの数値は、PHPで定義されているXML_DOCUMENT_NODEやXML_ELEMENT_NODEといった定数に対応しており、コードの可読性を高めるために定数を利用することが推奨されます。
サンプルコードでは、まずHTML文字列を読み込んでDOMDocumentオブジェクトを生成しています。そして、オブジェクト自身や、そこに含まれるDOCTYPE宣言、<html>要素、コメント、<h1>タグ内のテキストといった様々なノードにアクセスし、それぞれのnodeTypeプロパティの値を出力しています。実行結果から、ドキュメント全体は9、<html>要素は1、DOCTYPE宣言は10、コメントは8、テキストは3となり、ノードの種類に応じて異なる整数値が返されることが確認できます。このようにnodeTypeプロパティを利用することで、DOMツリー内の特定の種類のノードを判別して処理を分岐させることが可能になります。
nodeTypeプロパティは、DOMツリー内の各ノードがどのような種類(要素、テキスト、コメントなど)であるかを示す整数値を返します。DOMDocumentオブジェクト自身のnodeTypeは常に9(ドキュメントノード)ですが、その子ノードや孫ノード(要素、テキストなど)のnodeTypeはそれぞれ異なる値になりますので注意が必要です。例えば要素ノードは1、テキストノードは3、コメントノードは8を返します。これらの数値はPHPで定義されているXML_ELEMENT_NODEのような定数と比較すると、コードの可読性が向上します。HTMLを解析する際は、libxml_use_internal_errors(true)とlibxml_clear_errors()を使用し、パースエラーによる不要な警告を抑制すると、より安全に処理を進められます。
PHP DOM nodeType を確認する
1<?php 2 3// DOM拡張機能を利用し、様々なHTMLノードのnodeTypeプロパティを確認するサンプルコードです。 4// nodeTypeはノードの種類を数値で返します。 5 6// libxmlエラーを抑制します。 7libxml_use_internal_errors(true); 8 9// 新しいDOMDocumentオブジェクトを作成し、HTMLコンテンツをロードします。 10$dom = new DOMDocument(); 11$htmlContent = '<!DOCTYPE html> 12<html> 13<head> 14 <title>サンプルページ</title> 15</head> 16<body> 17 <h1>DOMノードタイプ</h1> 18 <!-- これはコメントノードです --> 19 <p>段落テキスト</p> 20</body> 21</html>'; 22$dom->loadHTML($htmlContent); 23 24echo "--- 各ノードのnodeType値 ---" . PHP_EOL; 25 26// 1. ドキュメントノード: DOMDocumentオブジェクト自体 (XML_DOCUMENT_NODE = 9) 27// HTMLドキュメント全体を表します。 28echo "DOMDocument (ドキュメント) の nodeType: " . $dom->nodeType . " (XML_DOCUMENT_NODE)" . PHP_EOL; 29 30// 2. ドキュメントタイプノード: <!DOCTYPE html> のような宣言 (XML_DOCUMENT_TYPE_NODE = 10) 31// $dom->firstChild は通常、このDOCTYPEノードを指します。 32if ($dom->firstChild instanceof DOMNode) { 33 echo "DOCTYPE (ドキュメントタイプ) の nodeType: " . $dom->firstChild->nodeType . " (XML_DOCUMENT_TYPE_NODE)" . PHP_EOL; 34} 35 36// 3. 要素ノード: <html>, <body>, <h1> などのHTMLタグ (XML_ELEMENT_NODE = 1) 37// $dom->documentElement は <html> タグを指します。 38if ($dom->documentElement instanceof DOMNode) { 39 echo "HTML要素 (<html>) の nodeType: " . $dom->documentElement->nodeType . " (XML_ELEMENT_NODE)" . PHP_EOL; 40 41 // <h1>要素のテキストノードを取得します。 42 $h1Elements = $dom->getElementsByTagName('h1'); 43 if ($h1Elements->length > 0) { 44 $h1Node = $h1Elements->item(0); 45 if ($h1Node->firstChild instanceof DOMNode) { 46 // 4. テキストノード: タグ内のテキストコンテンツ (XML_TEXT_NODE = 3) 47 echo "H1要素内のテキスト の nodeType: " . $h1Node->firstChild->nodeType . " (XML_TEXT_NODE)" . PHP_EOL; 48 } 49 } 50} 51 52// 5. コメントノード: <!-- ... --> のようなHTMLコメント (XML_COMMENT_NODE = 8) 53// ボディ要素内のコメントノードを探します。 54$bodyElements = $dom->getElementsByTagName('body'); 55if ($bodyElements->length > 0) { 56 $bodyNode = $bodyElements->item(0); 57 foreach ($bodyNode->childNodes as $childNode) { 58 if ($childNode->nodeType === XML_COMMENT_NODE) { 59 echo "コメントノード の nodeType: " . $childNode->nodeType . " (XML_COMMENT_NODE)" . PHP_EOL; 60 break; // 最初に見つかったコメントノードで表示を終了 61 } 62 } 63} 64 65?>
PHPのDOM拡張機能は、HTMLやXMLドキュメントをオブジェクトとして扱うための機能を提供します。Dom\DocumentクラスのnodeTypeプロパティは、このドキュメント内の各ノードがどのような種類であるかを数値で識別するために使用されます。このプロパティは引数を取らず、ノードの種類を示す整数値を返します。
例えば、HTMLドキュメント全体を表すDOMDocumentオブジェクト自体のnodeTypeは9(XML_DOCUMENT_NODE)を返します。また、<h1>や<p>のようなHTMLタグ(要素)は1(XML_ELEMENT_NODE)を、タグ内のテキストコンテンツは3(XML_TEXT_NODE)を、<!-- コメント -->は8(XML_COMMENT_NODE)を返します。<!DOCTYPE html>のような宣言は10(XML_DOCUMENT_TYPE_NODE)となります。
提供されたサンプルコードでは、libxml_use_internal_errors(true)でXML処理エラーを抑制し、ロードしたHTMLドキュメントからDOMDocumentオブジェクトやその子ノードを取得し、それぞれのnodeTypeプロパティの値を表示しています。これにより、ドキュメント内の多様なノードの種類を数値で判別できることがわかります。このnodeTypeは、DOMツリーを走査して特定の種類のノードを探したり、ノードの種類に応じて異なる処理を行う際に非常に役立つ基本的なプロパティです。
nodeTypeは、DOMDocumentオブジェクトを含む様々なDOMノードが持つプロパティで、ノードの種類を数値(定数)で返します。例えば、HTML要素は1(XML_ELEMENT_NODE)、ドキュメント自体は9(XML_DOCUMENT_NODE)、テキストノードは3(XML_TEXT_NODE)といった値です。これらの数値は、PHPが提供するXML_ELEMENT_NODEのような定数名と対応しており、コード中で定数名を利用すると、ノードの種類がより明確になり、可読性が向上します。また、サンプルコードにあるlibxml_use_internal_errors(true)は、HTMLのパース中に発生する可能性のある警告を抑制するための設定です。開発段階では、エラーの有無を確認するために一時的にこの設定を外すことも検討してください。DOMDocumentオブジェクトと、その中の要素やテキストなどの子ノードではnodeTypeが異なるため、どのノードのタイプを確認しているかを常に意識することが重要です。