【PHP8.x】Dom\XPath::documentプロパティの使い方
documentプロパティの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
『documentプロパティは、XPathクエリの実行対象となるDom\Documentオブジェクトを保持するプロパティです。Dom\XPathクラスのインスタンスは、特定のXMLやHTMLドキュメントに対してXPath式を評価するために作成されます。このdocumentプロパティには、そのインスタンスが関連付けられているドキュメントオブジェクトそのものが格納されています。具体的には、Dom\XPathのコンストラクタに渡されたDom\Documentオブジェクトと同じものを参照します。このプロパティを利用することで、XPathクエリを実行した後でも、どのドキュメントを操作しているかを常に確認でき、元のドキュメントオブジェクトにアクセスして、さらに別の操作を行うことが可能になります。このプロパティは読み取り専用(readonly)であるため、一度Dom\XPathオブジェクトが生成されると、後から別のドキュメントに差し替えることはできません。この仕様は、処理の途中で対象ドキュメントが意図せず変更されることを防ぎ、コードの安定性と予測可能性を高めるのに役立ちます。したがって、documentプロパティは、Dom\XPathオブジェクトとそれが操作するドキュメントとの間の明確な関連付けを管理するための重要な役割を担っています。』
構文(syntax)
1<?php 2 3$document = new \DOMDocument(); 4$document->loadXML('<users><user>Alice</user></users>'); 5 6$xpath = new \Dom\XPath($document); 7 8// DOMXPathオブジェクトに関連付けられているDOMDocumentオブジェクトを取得します。 9$retrievedDocument = $xpath->document; 10 11// 取得したドキュメントのルート要素のタグ名を出力します。 12echo $retrievedDocument->documentElement->tagName; 13 14?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
Dom\Document
この document プロパティは、XPath クエリを実行する対象となる DOMDocument オブジェクトを返します。
サンプルコード
PHP Dom\XPath::document でドキュメントを取得する
1<?php 2 3/** 4 * Dom\XPath::document プロパティの使用例をデモンストレーションします。 5 * 6 * このプロパティは、Dom\XPath オブジェクトが関連付けられている Dom\Document オブジェクトを返します。 7 * キーワード「php document_root」は、ここではファイルシステム上のパスではなく、 8 * XPath オブジェクトが操作しているXML/HTMLの「ドキュメントのルート(文書全体)」を指すものと解釈し、 9 * Dom\XPath::document がそれを取得する様子を示します。 10 */ 11function demonstrateXPathDocumentProperty(): void 12{ 13 // 処理対象となるXML文字列を定義します。 14 $xmlString = <<<XML 15<?xml version="1.0" encoding="UTF-8"?> 16<bookstore> 17 <book category="cooking"> 18 <title lang="en">Everyday Italian</title> 19 <author>Giada De Laurentiis</author> 20 <year>2005</year> 21 <price>30.00</price> 22 </book> 23 <book category="children"> 24 <title lang="en">Harry Potter</title> 25 <author>J.K. Rowling</author> 26 <year>2005</year> 27 <price>29.99</price> 28 </book> 29</bookstore> 30XML; 31 32 // Dom\Document オブジェクトを作成し、XMLをロードします。 33 $originalDom = new Dom\Document(); 34 $originalDom->loadXML($xmlString); 35 36 // ロードされたDom\Documentオブジェクトの情報を表示します。 37 echo "オリジナル Dom\\Document オブジェクトのハッシュ: " . spl_object_hash($originalDom) . PHP_EOL; 38 echo "オリジナル Dom\\Document のルート要素名: " . $originalDom->documentElement->nodeName . PHP_EOL . PHP_EOL; 39 40 // Dom\XPath オブジェクトを作成し、オリジナル Dom\Document を関連付けます。 41 $xpath = new Dom\XPath($originalDom); 42 43 // Dom\XPath::document プロパティを使用して、関連付けられた Dom\Document オブジェクトを取得します。 44 $retrievedDom = $xpath->document; 45 46 // 取得した Dom\Document オブジェクトの情報を表示します。 47 echo "Dom\\XPath::document で取得した Dom\\Document オブジェクトのハッシュ: " . spl_object_hash($retrievedDom) . PHP_EOL; 48 echo "取得した Dom\\Document のルート要素名: " . $retrievedDom->documentElement->nodeName . PHP_EOL . PHP_EOL; 49 50 // オリジナルの Dom\Document オブジェクトと取得したオブジェクトが同一であることを確認します。 51 if ($originalDom === $retrievedDom) { 52 echo "検証: 取得された Dom\\Document オブジェクトは、オリジナルの Dom\\Document オブジェクトと同一です。" . PHP_EOL; 53 } else { 54 echo "検証: 取得された Dom\\Document オブジェクトは、オリジナルの Dom\\Document オブジェクトと異なります。" . PHP_EOL; 55 } 56} 57 58// 関数を実行して、Dom\XPath::document プロパティの動作をデモンストレーションします。 59demonstrateXPathDocumentProperty();
Dom\XPath::documentプロパティは、XMLやHTMLドキュメント内を検索する際に使用するDom\XPathオブジェクトが、どのDom\Documentオブジェクトと関連付けられているかを返すためのものです。このプロパティには引数がなく、Dom\Document型のオブジェクトを返します。
システムエンジニアがXMLやHTMLを扱う際、特定の要素をXPathで効率的に見つけることができますが、その操作対象である文書全体(「ドキュメントのルート」と解釈されます。ファイルシステムの「php document_root」とは異なります)に、後から再度アクセスしたい場面があります。そのような場合、Dom\XPath::documentプロパティを利用することで、別途ドキュメントを保持していなくても、現在操作しているDom\XPathオブジェクトから関連付けられたDom\Documentオブジェクトを直接取得できます。
サンプルコードでは、まずXML文字列からDom\Documentオブジェクトを作成し、それを基にDom\XPathオブジェクトを初期化しています。その後、$xpath->documentとすることで、最初に作成したDom\Documentオブジェクトと全く同じインスタンスが取得できることを、オブジェクトのハッシュ値と同一性チェックによって示しています。これにより、Dom\XPathオブジェクトが内部的にどのドキュメントを扱っているかを明確に把握し、そのドキュメント自体を再利用したり、他の処理に渡したりすることが容易になります。
Dom\XPath::documentプロパティが指す「document」は、WebサーバーのDOCUMENT_ROOTのようなファイルシステム上のパスではなく、操作対象のXMLやHTML文書全体を意味します。このプロパティは、Dom\XPathオブジェクトが関連付けられたDom\Documentオブジェクトそのものを返します。つまり、オブジェクトのコピーではなく元の参照ですので、取得したDom\Documentオブジェクトを変更すると、元の文書にも変更が反映される点にご注意ください。このクラスを使用するには、PHPのDOM拡張モジュールが有効になっている必要があります。実運用では、XMLの読み込み失敗などに対するエラーハンドリングも適切に行うことが安全なコードに繋がります。
Dom\XPath::documentで関連Documentを取得する
1<?php 2 3/** 4 * Dom\XPath::document プロパティの使用例 5 * 6 * このプロパティは、Dom\XPath オブジェクトが関連付けられている Dom\Document オブジェクトを返します。 7 * Dom\XPath は、XML ドキュメント内で XPath クエリを実行するために使用されます。 8 */ 9function demonstrateXPathDocumentProperty(): void 10{ 11 // 1. XML文字列を準備します。 12 $xmlString = <<<XML 13<?xml version="1.0" encoding="UTF-8"?> 14<library> 15 <book id="1"> 16 <title>The Great PHP Guide</title> 17 <author>John Doe</author> 18 </book> 19 <book id="2"> 20 <title>Mastering Web Development</title> 21 <author>Jane Smith</author> 22 </book> 23</library> 24XML; 25 26 // 2. 新しい Dom\Document インスタンスを作成し、XMLをロードします。 27 echo "Dom\Document インスタンスを生成し、XMLをロードします。\n"; 28 $originalDocument = new Dom\Document(); 29 $originalDocument->loadXML($xmlString); 30 31 // 3. Dom\XPath インスタンスを作成し、作成した Dom\Document を関連付けます。 32 echo "Dom\XPath インスタンスを生成し、Dom\Document に関連付けます。\n"; 33 $xpath = new Dom\XPath($originalDocument); 34 35 // 4. Dom\XPath::document プロパティにアクセスして、関連する Dom\Document を取得します。 36 echo "Dom\XPath::document プロパティを使用して、関連する Dom\Document を取得します。\n"; 37 $retrievedDocument = $xpath->document; 38 39 // 5. 取得した Dom\Document が元の Dom\Document と同じインスタンスであるかを確認します。 40 // 同じインスタンスであるべきです。 41 echo "元の Dom\Document と XPath から取得した Dom\Document は同じインスタンスか?\n"; 42 if ($originalDocument === $retrievedDocument) { 43 echo "-> はい、同じ Dom\Document インスタンスです。\n"; 44 // 取得したドキュメントのルート要素名を表示して確認します。 45 echo "-> 取得したドキュメントのルート要素: " . $retrievedDocument->documentElement->nodeName . "\n"; 46 } else { 47 echo "-> いいえ、異なる Dom\Document インスタンスです。(これは通常予期されません)\n"; 48 } 49} 50 51// 関数を実行して、Dom\XPath::document の動作を確認します。 52demonstrateXPathDocumentProperty(); 53
PHPのDom\XPath::documentプロパティは、XMLドキュメントを操作する際に利用される重要な要素です。このプロパティは、Dom\XPathオブジェクトが関連付けられているDom\Documentオブジェクトを返します。
Dom\DocumentはXMLドキュメント全体をメモリ上でオブジェクトとして表現するもので、Dom\XPathはこのDom\Documentの中から特定の情報(要素や属性など)をXPathクエリという構文を使って検索するためのツールです。Dom\XPathインスタンスを作成する際には、必ず処理対象となるDom\Documentインスタンスを渡して関連付けます。
サンプルコードでは、まずXMLデータからDom\Documentを作成し、次にこのドキュメントを元にDom\XPathインスタンスを初期化しています。その後、$xpath->documentとアクセスすることで、Dom\XPathが内部で参照しているDom\Documentインスタンスを取得しています。このプロパティは引数を持たず、常にDom\Documentインスタンスを戻り値として返します。これにより、XPath処理中にそのドキュメント自体へのアクセスが必要になった場合でも、簡単に元のDom\Documentオブジェクトを参照できるようになります。取得されるドキュメントは、Dom\XPathが初期化された際に渡されたものと全く同じインスタンスです。
Dom\XPath::documentプロパティは、XPathオブジェクトが操作対象としているDom\Documentオブジェクトを取得する際に利用されます。このプロパティは、Dom\XPathインスタンスの生成時に渡された既存のDom\Documentオブジェクトの参照を返すものです。新しいDom\Documentオブジェクトが生成されるわけではないため、取得したドキュメントへの変更は、元のドキュメントにも直接反映される点にご注意ください。このプロパティは、XPathクエリの実行中に元のドキュメント全体へのアクセスが必要になった際に便利です。両オブジェクトの関係性を正しく理解し、安全なXML処理に役立ててください。