【PHP8.x】DOMElement::baseURIプロパティの使い方
baseURIプロパティの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
baseURIプロパティは、DOMElementノードのベースURI(Base Uniform Resource Identifier)を保持するプロパティです。このプロパティは、ノードが定義されているドキュメントまたは外部エンティティの場所を示すURIを返します。ベースURIは、相対URIを絶対URIに解決する際に使用されます。
具体的には、XML文書やHTML文書内に記述されたURIが相対パスで指定されている場合、その相対パスを解決するために、baseURIプロパティが参照されます。例えば、HTML文書内で<img src="images/logo.png">という記述があった場合、images/logo.pngは相対URIです。この画像要素のbaseURIプロパティがhttp://example.com/を指していれば、画像ファイルの絶対URIはhttp://example.com/images/logo.pngとなります。
baseURIプロパティの値は、次のいずれかになります。
- ノードが属するドキュメントのURI: ドキュメント自体がURIを持つ場合(例えば、ウェブページとして読み込まれたHTML文書など)。
- ノードが定義されている外部エンティティのURI: 例えば、XML文書内で外部エンティティ参照が使用されている場合、そのエンティティが定義されているファイルのURI。
null: ノードがどのURIにも関連付けられていない場合。これは、例えば、プログラム内でDOMを生成した場合などが該当します。
システムエンジニアは、XMLやHTMLを扱う際、XPathやDOM操作を通してこのbaseURIプロパティを使用する場合があります。特に、複数のXML文書を扱うシステムや、動的にコンテンツを生成するウェブアプリケーションにおいては、baseURIを正しく理解し利用することが重要です。相対URIを解決する処理を実装する際などに、このプロパティの存在を知っておくと、効率的な開発につながります。
構文(syntax)
1DOMElement::$baseURI;
引数(parameters)
引数なし
引数はありません
戻り値(return)
string
DOMElementオブジェクトが属するドキュメントのベースURIを表す文字列を返します。
サンプルコード
PHP DOMElement::baseURI で基底URIを取得する
1<?php 2 3/** 4 * DOMElement::baseURI プロパティの動作を示すサンプル関数です。 5 * このプロパティは、XMLドキュメント内の要素の基底URI(相対URIを解決する際の基準)を返します。 6 */ 7function demonstrateDOMElementBaseURI(): void 8{ 9 // XML文字列を定義します。 10 // <item>要素には 'xml:base' 属性で明示的な基底URIが設定されています。 11 $xmlString = <<<XML 12<?xml version="1.0" encoding="UTF-8"?> 13<root> 14 <item xml:base="http://example.com/products/"> 15 <product id="101">Widget A</product> 16 </item> 17 <category> 18 <name>Electronics</name> 19 </category> 20</root> 21XML; 22 23 // DOMDocumentオブジェクトを生成し、XMLをロードします。 24 $dom = new DOMDocument(); 25 if (!$dom->loadXML($xmlString)) { 26 echo "XMLのロードに失敗しました。\n"; 27 return; 28 } 29 30 // 'item' 要素を取得します。この要素には 'xml:base' が設定されています。 31 $itemElement = $dom->getElementsByTagName('item')->item(0); 32 33 if ($itemElement instanceof DOMElement) { 34 // 'item' 要素の baseURI を出力します。 35 // 'xml:base' 属性で指定されたURIが返されます。 36 echo "'item' 要素の基底URI: " . $itemElement->baseURI . "\n"; 37 } 38 39 // 'category' 要素を取得します。この要素には 'xml:base' は設定されていません。 40 $categoryElement = $dom->getElementsByTagName('category')->item(0); 41 42 if ($categoryElement instanceof DOMElement) { 43 // 'category' 要素の baseURI を出力します。 44 // この場合、ドキュメント自体の基底URI(文字列からロードした場合は通常空文字列)が返されます。 45 echo "'category' 要素の基底URI: " . $categoryElement->baseURI . "\n"; 46 } 47} 48 49// 関数を実行してサンプルコードの動作を確認します。 50demonstrateDOMElementBaseURI();
DOMElement::baseURIプロパティは、XMLドキュメント内の特定の要素に対する基底URI(Base URI)を取得するために使用されます。基底URIとは、その要素内で定義される可能性のある相対URIを解決する際の基準となるURIのことです。このプロパティには引数がなく、常に文字列(string)を返します。
このプロパティは、主にXMLドキュメント内のxml:base属性によって明示的に設定された基底URIを反映します。サンプルコードでは、<item>要素にxml:base="http://example.com/products/"が指定されているため、その要素のbaseURIは"http://example.com/products/"を返します。これにより、<item>要素内で記述される相対URIは、この基底URIを基準として解釈されます。
一方、<category>要素のようにxml:base属性が明示的に設定されていない場合、その要素のbaseURIは、親要素やドキュメント自体の基底URIが適用されます。サンプルコードのように文字列からXMLをロードした場合、ドキュメントの基底URIは通常空文字列となるため、<category>要素のbaseURIも空文字列を返します。
このプロパティは、XMLドキュメントをパースしてURI情報を正確に扱う必要がある場面で非常に有用です。特に、XMLベースのデータ交換やWebサービスの処理において、相対URIの解決を正確に行い、データの整合性を保つために重要な役割を果たします。
DOMElement::baseURIプロパティは、XML要素の基底URIを文字列で返します。これは、XML内の相対パスを解決する際の基準となるURIです。要素にxml:base属性が明示されていればその値が、なければ親要素やドキュメントのURIが基底となります。サンプルでは文字列からXMLをロード(loadXML)しているため、ドキュメントの基底URIは空文字列です。しかし、XMLファイルをloadメソッドで読み込むと、そのファイルのURIが基底となります。
getElementsByTagNameなどで要素を取得する際、対象が見つからないとnullが返されるため、if ($element instanceof DOMElement)のように型を確認してからbaseURIにアクセスすることで、プログラムが安全に動作します。これはDOM操作全般に言える重要な注意点です。
DOMElement::baseURIでベースURIを取得する
1<?php 2 3/** 4 * DOMElement::baseURI プロパティの取得例を示す関数です。 5 * 6 * このプロパティは、特定のDOM要素(DOMElement)の「ベースURI」を返します。 7 * ベースURIとは、その要素内で使用される相対URI(例えば、画像やリンクのパス)を 8 * 解決する際の基準となる絶対URIのことです。 9 * 10 * XML文書の場合、xml:base属性を使って要素のベースURIを明示的に設定できます。 11 * HTML文書の場合、<base>要素が文書全体のベースURIに影響を与えることがありますが、 12 * 個々のDOMElementのbaseURIは、文書のURIや親要素のbaseURIから決定されます。 13 * 14 * 初心者の方が「php get baseurl」というキーワードで検索した場合、 15 * ウェブアプリケーションのルートURL取得と混同する可能性がありますが、 16 * ここでのbaseURIは、XML/HTML文書内の特定の要素に関連付けられたURIを指します。 17 */ 18function getDomElementBaseUriExample(): void 19{ 20 // サンプルXML文字列を定義します。 21 // <item id="1">要素には xml:base 属性でベースURIを設定しています。 22 // <item id="2">要素には xml:base 属性がありません。 23 $xmlString = <<<'XML' 24<?xml version="1.0" encoding="UTF-8"?> 25<root xmlns:xml="http://www.w3.org/XML/1998/namespace"> 26 <item id="1" xml:base="http://example.com/categoryA/"> 27 <title>Item A</title> 28 <link rel="self" href="product1.html"/> 29 </item> 30 <item id="2"> 31 <title>Item B</title> 32 <link rel="self" href="product2.html"/> 33 </item> 34</root> 35XML; 36 37 // DOMDocumentオブジェクトを作成します。 38 $dom = new DOMDocument(); 39 40 // XMLをロードする際に発生する可能性のあるエラーを捕捉するため、 41 // libxmlの内部エラーハンドリングを有効にします。 42 libxml_use_internal_errors(true); 43 44 // XML文字列をDOMDocumentにロードします。 45 if (!$dom->loadXML($xmlString)) { 46 echo "Error loading XML:\n"; 47 foreach (libxml_get_errors() as $error) { 48 echo " - " . trim($error->message) . "\n"; 49 } 50 libxml_clear_errors(); // エラー情報をクリアします。 51 return; 52 } 53 libxml_clear_errors(); // ロード成功後もエラー情報をクリアします。 54 55 echo "--- DOMElement::baseURI の取得例 ---\n"; 56 57 // XML内のすべての 'item' 要素を取得します。 58 $items = $dom->getElementsByTagName('item'); 59 60 // 最初の 'item' 要素 (id="1") を取得します。 61 if ($items->count() > 0) { 62 $item1 = $items->item(0); 63 echo "Item 1 (xml:base='http://example.com/categoryA/') の baseURI: "; 64 // <item id="1"> には xml:base 属性が設定されているため、その値が baseURI となります。 65 echo $item1->baseURI . "\n"; 66 67 // Item 1 の子要素である 'link' 要素を取得します。 68 $link1 = $item1->getElementsByTagName('link')->item(0); 69 if ($link1) { 70 echo "Item 1 内の link 要素の baseURI: "; 71 // <link> 要素自体には xml:base がないため、親要素 (<item id="1">) から baseURI を継承します。 72 echo $link1->baseURI . "\n"; 73 } 74 } 75 76 // 2番目の 'item' 要素 (id="2") を取得します。 77 if ($items->count() > 1) { 78 $item2 = $items->item(1); 79 echo "Item 2 (xml:baseなし) の baseURI: "; 80 // <item id="2"> には xml:base 属性が設定されていません。 81 // DOMDocument::loadXML() で文字列をロードした場合、 82 // 明示的に文書のURIが設定されていない限り、文書自体の baseURI は通常空文字列になります。 83 // そのため、この要素の baseURI も空文字列になります。 84 echo "'" . $item2->baseURI . "'\n"; 85 } 86} 87 88// サンプル関数を実行します。 89getDomElementBaseUriExample(); 90
PHP 8のDOMElement::baseURIプロパティは、XMLやHTMLなどのDOM(Document Object Model)ツリー内の特定の要素(DOMElement)に関連付けられた「ベースURI」を取得する際に使用されます。このプロパティに引数はなく、常に文字列型の値を返します。ベースURIとは、その要素内で相対URI(例えば、画像やリンクのパス)が指定された際に、それを完全なURL(絶対URI)として解決するための基準となる絶対URIのことです。
具体的には、XML文書において要素にxml:base属性が明示的に設定されている場合、その属性値がbaseURIプロパティの値となります。xml:base属性が設定されていない場合は、その要素は親要素のベースURIを継承したり、文書自体のURIが適用されたりします。HTML文書では、<base>要素が文書全体のベースURIに影響を与えることもありますが、個々の要素のベースURIは、文書のURIや親要素のベースURIから決定されます。
このサンプルコードでは、xml:base属性を持つitem要素と持たないitem要素を含むXML文字列を解析しています。xml:base属性を持つitem要素からはその属性値がbaseURIとして取得され、その子要素も同じベースURIを継承することが確認できます。一方、xml:base属性を持たないitem要素は、XMLがファイルパスではなく文字列としてロードされたため、明示的な文書URIが設定されていない場合は空文字列を返すことがあります。
システムエンジニアを目指す初心者の方が「php get baseurl」といったキーワードでウェブアプリケーションのルートURL取得方法を探している場合、このDOMElement::baseURIプロパティと混同される可能性があります。しかし、このプロパティはあくまでXML/HTML文書内の特定の要素に紐付くURIを指すため、一般的なウェブアプリケーションのベースURLとは用途が異なる点にご注意ください。
DOMElement::baseURIは、ウェブアプリケーションのルートURLとは異なり、XMLやHTML文書内の特定の要素における相対URIの解決基準となるURIを指します。このURIは、要素にxml:base属性が明示されていればその値となり、なければ親要素のベースURIを継承して決定されます。文書自体がURIを持たない場合、例えば文字列からXMLをロードした際には、baseURIが空文字列となることがありますので注意してください。サンプルコードのようにDOMDocument::loadXML()を使用する際は、XMLのパースエラーを適切に処理するため、libxml_use_internal_errorsを用いたエラーハンドリングを必ず実施してください。戻り値は常に文字列ですが、ベースURIが存在しない場合は空文字列が返されることを理解して利用してください。