Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】DOMDocumentType::baseURIプロパティの使い方

baseURIプロパティの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

baseURIプロパティは、DOMDocumentTypeオブジェクトが表現する文書の基底URI(Base URI)を保持するプロパティです。このプロパティは、文書内の相対URI(Relative URI)を絶対URI(Absolute URI)に解決する際の基準となるURIを提供します。

基底URIとは、例えばウェブページ内に記述された<img src="images/logo.png">のような相対パスの画像を、実際にインターネット上のどの場所から読み込むかを決定するための基準となるURLやファイルパスのことです。このプロパティの値は、通常、その文書が読み込まれた元のファイルパスや、ウェブサーバーから取得された際のURLとなります。

DOMDocumentTypeクラスは、XMLやHTMLなどの文書におけるDOCTYPE宣言(文書型定義)を表すオブジェクトです。baseURIプロパティは、このDOMDocumentTypeが関連付けられている文書全体に対して適用される基底URIを示します。これにより、文書内の他の要素や属性が持つ相対URIを正しく解決するための情報が得られます。

このプロパティは読み取り専用であり、その値をプログラムから直接変更することはできません。DOMDocumentTypeオブジェクトを通じて、当該文書の基底となる情報にアクセスする場合に利用されます。システムが相対パスの情報を絶対パスに変換する必要がある際に、このbaseURIプロパティが非常に役立ちます。

構文(syntax)

1<?php
2$dom = new DOMDocument();
3$dom->loadHTML('<!DOCTYPE html><html><body></body></html>');
4
5$doctype = $dom->doctype;
6
7if ($doctype instanceof DOMDocumentType) {
8    $baseURI = $doctype->baseURI;
9}

引数(parameters)

引数なし

引数はありません

戻り値(return)

?string

DOMDocumentTypeクラスのbaseURIプロパティは、このDOCTYPE宣言の基底URIを文字列で返します。基底URIが定義されていない場合はnullを返します。

サンプルコード

PHP DOMDocumentType baseURI を取得する

1<?php
2
3/**
4 * DOMDocumentType の baseURI プロパティの使用例を示す関数。
5 *
6 * baseURI プロパティは、ドキュメントの DOCTYPE (文書型宣言) が
7 * 外部サブセット (例えば、外部のDTDファイル) を参照している場合に、
8 * そのURIを返します。
9 * 内部DTDのみの場合や、HTML5のDOCTYPE宣言 ('<!DOCTYPE html>') のように
10 * 外部サブセットを持たない場合には、null を返します。
11 *
12 * この関数は、外部DTDを参照するXHTML文書の例を使用して baseURI を取得し、表示します。
13 */
14function showDomDocumentTypeBaseUriExample(): void
15{
16    // 外部DTDを参照するXHTML文書の例
17    // この場合、baseURI は "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" を返すことが期待されます。
18    $xmlString = <<<XML
19<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
20<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
21    <head>
22        <title>DOMDocumentType::baseURI Example</title>
23    </head>
24    <body>
25        <h1>Hello XHTML</h1>
26    </body>
27</html>
28XML;
29
30    // DOMDocument オブジェクトを作成し、XMLをロード
31    $dom = new DOMDocument();
32    // loadXML() は XML を解析します。エラーが発生する可能性があるので抑制します
33    // (例: 外部DTDのURLにアクセスできない場合など)。
34    @$dom->loadXML($xmlString);
35
36    // ドキュメントの DOMDocumentType オブジェクトを取得
37    // DOCTYPE宣言がない場合、$dom->doctype は null になります。
38    $doctype = $dom->doctype;
39
40    if ($doctype !== null) {
41        echo "ドキュメント型名: " . $doctype->name . "\n";
42
43        // DOMDocumentType::baseURI プロパティにアクセス
44        // 戻り値は ?string (null または文字列) です。
45        $baseUri = $doctype->baseURI;
46
47        if ($baseUri !== null) {
48            echo "DOCTYPE の baseURI: " . $baseUri . "\n";
49        } else {
50            echo "DOCTYPE に関連付けられた外部 baseURI はありません (null)。\n";
51            echo "これは、ドキュメントが内部DTDのみを持つ場合や、\n";
52            echo "HTML5のDOCTYPE宣言のように外部サブセットを持たない場合に発生します。\n";
53        }
54    } else {
55        echo "このドキュメントには DOCTYPE が見つかりませんでした。\n";
56    }
57}
58
59// サンプル関数を実行
60showDomDocumentTypeBaseUriExample();
61

PHP 8のDOMDocumentType::baseURIプロパティは、XMLやHTML文書のDOCTYPE(文書型宣言)に関する基底URIを取得するために使用されます。このプロパティは、DOCTYPE宣言が外部のDTDファイル(文書型定義ファイル)などを参照している場合に、そのURIをstring型で返します。例えば、XHTML文書が外部のDTDを参照している場合、そのDTDファイルのURLが返される動作です。

もしDOCTYPEが内部のDTDのみを持つ場合や、HTML5の<!DOCTYPE html>のように外部サブセットを参照していない場合には、戻り値はnullとなります。PHP 8の型ヒントで?stringと示されているのは、文字列またはnullのどちらかが返されることを意味しています。引数は必要ありません。

サンプルコードでは、外部DTDを参照するXHTML文書をDOMDocumentにロードし、そこからDOMDocumentTypeオブジェクトを取得しています。このオブジェクトのbaseURIプロパティにアクセスすることで、DOCTYPEが外部リソースを参照しているか、またそのURIが何であるかを確認し、結果を表示しています。これにより、文書の型定義がどこにあるかをプログラムで簡単に判断できるようになります。

DOMDocumentType::baseURIプロパティは、DOCTYPE宣言が外部DTD(文書型定義)ファイルを参照している場合にそのURIを返します。外部DTDを参照しないHTML5の<!DOCTYPE html>のような宣言や、内部DTDのみの場合はnullを返すため、必ず取得した値がnullでないかを確認してから利用してください。

また、DOMDocument::$doctypeプロパティ自体も、文書にDOCTYPE宣言がない場合はnullを返します。そのため、baseURIにアクセスする前にDOMDocumentTypeオブジェクトが正しく取得できているかどうかのチェックも重要です。

DOMDocument::loadXML()などを使用する際、外部DTDへのネットワークアクセス失敗やXML構文エラーが発生する可能性があります。サンプルコードの@記号によるエラー抑制は開発時の簡略化であり、本番環境ではエラーを適切に捕捉し、処理する本格的なエラーハンドリング(例えばlibxml_use_internal_errors()libxml_get_errors()の組み合わせ)の実装を強く推奨します。これにより、予期せぬ挙動を防ぎ、堅牢なシステムを構築できます。

PHP DOMDocumentType baseURI を取得する

1<?php
2
3/**
4 * DOMDocumentType::baseURI プロパティの使用例を示す関数です。
5 *
6 * この関数は、外部DTD (Document Type Definition) を参照するXMLドキュメントを読み込み、
7 * そのDTDのベースURI (基底URI) を取得する方法を示します。
8 * baseURI プロパティは、DOMノードが属するリソースの基底URIを返します。
9 * DOMDocumentType の場合、外部DTDファイルのURIがこれに該当することがあります。
10 *
11 * @return void
12 */
13function showDomDocumentTypeBaseUriExample(): void
14{
15    // DOMDocument オブジェクトを初期化します。
16    $dom = new DOMDocument();
17
18    // 外部DTDを参照するXML文字列を定義します。
19    // ここで "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" がDTDのURIです。
20    // このURIが DOMDocumentType の baseURI プロパティの値として取得されることを期待します。
21    $xmlContent = <<<XML
22<?xml version="1.0" encoding="UTF-8"?>
23<!DOCTYPE greeting PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
24  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
25<greeting>Hello, World!</greeting>
26XML;
27
28    // XML文字列をパースします。
29    // 外部DTDを読み込む場合、ネットワークアクセスが必要となることがあります。
30    // `@` を付けてエラー抑制し、`loadXML` の戻り値で成否を判断します。
31    if (@$dom->loadXML($xmlContent) === false) {
32        echo "XMLの読み込みに失敗しました。外部DTDへのアクセスに問題がある可能性があります。" . PHP_EOL;
33        return;
34    }
35
36    // ドキュメントタイプ (DOCTYPE) ノードを取得します。
37    // XMLドキュメントに `<!DOCTYPE ...>` が含まれていない場合、`null` が返されます。
38    $documentType = $dom->doctype;
39
40    // `DOMDocumentType` オブジェクトが取得できたか確認します。
41    if ($documentType instanceof DOMDocumentType) {
42        // `DOMDocumentType::baseURI` プロパティからベースURIを取得します。
43        // 戻り値は `?string` (null許容文字列) なので、`null` の可能性を考慮します。
44        $baseUri = $documentType->baseURI;
45
46        if ($baseUri !== null) {
47            echo "DOMDocumentType のベースURI: " . $baseUri . PHP_EOL;
48        } else {
49            echo "DOMDocumentType のベースURIは設定されていません(または取得できませんでした)。" . PHP_EOL;
50            echo "これは、DTDが外部参照を持たない場合や、URIが解決できない場合に発生することがあります。" . PHP_EOL;
51        }
52    } else {
53        echo "ドキュメントに DOCTYPE が見つかりませんでした。" . PHP_EOL;
54    }
55}
56
57// サンプル関数を実行します。
58showDomDocumentTypeBaseUriExample();

DOMDocumentType::baseURIプロパティは、XMLドキュメントが参照する外部DTD(Document Type Definition)の基底URI(base URI)を取得するために使用されます。基底URIとは、そのノードが属するリソースの基準となるURIのことです。このプロパティは引数を取らず、戻り値として?string、つまり文字列またはnullを返します。DOMDocumentTypeオブジェクトにおいて、このプロパティは通常、外部DTDファイルのURLを指します。

サンプルコードでは、まずDOMDocumentオブジェクトを生成し、外部DTDを参照するXML文字列をloadXMLメソッドでパースしています。XMLの読み込みに成功すると、$dom->doctypeプロパティを通じてドキュメントのDOCTYPE情報を表すDOMDocumentTypeオブジェクトを取得できます。

次に、取得したDOMDocumentTypeオブジェクトのbaseURIプロパティにアクセスし、外部DTDの基底URIを取得します。この例では、XML文字列内で定義された"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"というURIが取得されることを期待しています。baseURInullを返す可能性があるため、取得した値がnullでないかを確認する処理が含まれています。これは、DTDが外部参照を持たない場合や、URIの解決に失敗した場合にnullが返されるためです。最終的に、取得できたURIを表示するか、取得できなかった旨をユーザーに伝えます。これにより、XMLドキュメントがどのような外部リソースを参照しているかをプログラム的に確認することが可能です。

このサンプルコードを利用する際は、いくつかの注意点があります。まず、DOMDocument::loadXML() は外部DTD(文書型定義)の読み込みにネットワークアクセスを伴うため、ネットワーク障害などで失敗する可能性があります。エラー抑制(@)を使っている場合は特に、戻り値を必ず確認して処理の成否を判断してください。次に、$dom->doctype プロパティは、ドキュメントにDOCTYPE宣言が含まれていない場合 null を返します。そのため、instanceof DOMDocumentType を使って、実際にオブジェクトが取得できたかを常に確認する必要があります。最後に、DOMDocumentType::baseURI プロパティは null を返す可能性がある(?string型)ため、null が返された場合の処理を必ず記述してください。この baseURI はDTDファイルのURIを示すものであり、一般的なウェブサイトの基底URLとは用途が異なる点にもご注意ください。

関連コンテンツ

関連IT用語

関連プログラミング言語