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

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

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

作成日: 更新日:

基本的な使い方

systemIdプロパティは、DOMDocumentTypeクラスに属し、DOCTYPE宣言内のSYSTEM識別子を保持するプロパティです。DOMDocumentTypeクラスは、XMLやHTMLドキュメントの冒頭に記述されるDOCTYPE宣言(文書型宣言)を表します。このsystemIdプロパティは、DOCTYPE宣言で指定された外部サブセットのURI(Uniform Resource Identifier)や、公開識別子に関連付けられたシステム識別子、つまりDTD(Document Type Definition)ファイルの場所を示す情報を保持しています。

例えば、HTMLやXMLドキュメントにおいて、外部DTDファイルを参照するためにSYSTEMキーワードが使われる場合、そのURIがsystemIdプロパティの値として取得されます。このプロパティは読み取り専用であり、その値を直接変更することはできません。もし、DOCTYPE宣言にSYSTEM識別子が指定されていない場合、systemIdプロパティは空文字列を返します。

このプロパティを使用することで、PHPプログラムからDOMツリーを操作する際に、読み込んだドキュメントがどのようなDTDを参照しているかを動的に確認できます。これにより、特定のDTDに準拠したドキュメントであるかどうかのチェックや、DTDの場所に基づいて処理を分岐させるなど、ドキュメントの型情報に基づいた柔軟な処理を実装することが可能です。

構文(syntax)

1<?php
2$dom = new DOMDocument();
3$dom->loadXML('<?xml version="1.0"?>
4<!DOCTYPE example SYSTEM "http://www.example.com/dtd/example.dtd">
5<example></example>');
6
7$documentType = $dom->doctype;
8
9echo $documentType->systemId;
10?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

string

DOMDocumentTypeのsystemIdプロパティは、DOCTYPE宣言で指定されたシステム識別子(System Identifier)を文字列として返します。これは、外部 DTD ファイルの URI を示します。

サンプルコード

PHP: DOMDocumentTypeのsystemIdを取得する

1<?php
2
3/**
4 * DOMDocumentType::systemId プロパティの使用例を示します。
5 *
6 * このプロパティは、XMLまたはHTMLドキュメントのDOCTYPE宣言において、
7 * 外部のDTD(Document Type Definition)のSYSTEM識別子(通常はURI)を取得するために使用されます。
8 */
9function getDoctypeSystemIdExample(): void
10{
11    // 新しい DOMDocument オブジェクトを作成
12    $dom = new DOMDocument();
13
14    // systemId を含むHTML 4.01 Transitional のDOCTYPEを持つHTML文字列
15    // ここでの systemId は "http://www.w3.org/TR/html4/loose.dtd" となります。
16    $htmlString = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">' .
17                  '<html><head><title>Sample</title></head><body><h1>Hello, PHP!</h1></body></html>';
18
19    // HTMLをDOMDocumentにロード
20    // @ を使用して、HTML5互換でないDOCTYPEに関する警告を抑制
21    @$dom->loadHTML($htmlString);
22
23    // ドキュメントの DOMDocumentType オブジェクトを取得
24    $documentType = $dom->doctype;
25
26    // DOMDocumentType オブジェクトが存在し、systemId が空でないかを確認
27    if ($documentType instanceof DOMDocumentType && $documentType->systemId !== '') {
28        // systemId プロパティの値を出力
29        echo "DOCTYPEのSYSTEM識別子 (systemId): " . $documentType->systemId . PHP_EOL;
30    } else {
31        // 有効な SYSTEM 識別子が見つからなかった場合のメッセージ
32        echo "このドキュメントには SYSTEM 識別子が指定された DOMDocumentType がありません。" . PHP_EOL;
33        // 例: <!DOCTYPE html> のようなHTML5のDOCTYPEでは systemId は通常空文字列になります。
34        if ($documentType instanceof DOMDocumentType) {
35            echo "現在のDOCTYPEの名前: " . $documentType->name . PHP_EOL;
36            echo "現在のDOCTYPEのsystemId: '" . $documentType->systemId . "'" . PHP_EOL;
37        }
38    }
39
40    // 補足: キーワード "php system('id')" はOSコマンドを実行する PHP の `system()` 関数を指しますが、
41    // `DOMDocumentType::systemId` プロパティとは機能的に全く関連がありません。
42}
43
44// サンプル関数の実行
45getDoctypeSystemIdExample();

PHPのDOMDocumentType::systemIdプロパティは、XMLやHTMLドキュメントのDOCTYPE宣言において、外部のDTD(Document Type Definition)のSYSTEM識別子を取得するために使用されます。このプロパティはDOMDocumentTypeクラスに属しており、引数はなく、SYSTEM識別子を表す文字列を戻り値として返します。

サンプルコードでは、DOMDocumentオブジェクトにHTML文字列を読み込ませることで、ドキュメントのDOCTYPE情報を扱っています。HTML 4.01 TransitionalのDOCTYPE宣言には"http://www.w3.org/TR/html4/loose.dtd"というSYSTEM識別子が指定されており、$dom->doctypeから取得したDOMDocumentTypeオブジェクトのsystemIdプロパティにアクセスすることで、この文字列を取得・表示しています。この値は、外部のDTDファイルの場所を示すURIとして機能します。

ただし、HTML5の<!DOCTYPE html>のように外部DTDを参照しない新しい形式のDOCTYPE宣言の場合、systemIdプロパティは空文字列を返します。このプロパティは、特に古いHTMLやXMLドキュメントで、その構造定義がどこにあるかをプログラム的に確認する際に役立ちます。

なお、キーワードとして提示されたphp system('id')は、PHPのsystem()関数を使ってOSコマンドを実行する機能であり、ここで説明しているDOMDocumentType::systemIdプロパティとは機能的に全く関連性がありませんので、混同しないようにご注意ください。

PHPのDOMDocumentType::systemIdプロパティは、XMLやHTMLドキュメントのDOCTYPE宣言において、外部DTDのURL(システム識別子)を取得するものです。キーワードにあるsystem()関数とは機能的に全く関連がなく、OSコマンドの実行とは異なりますので混同しないよう注意してください。

サンプルコードのようにHTML5の<!DOCTYPE html>形式のDOCTYPEではsystemIdは通常空文字列を返します。また、@演算子を使って警告を抑制していますが、これはエラーの原因を隠してしまうため、本来は推奨されません。エラーメッセージを解析し、適切な処理を記述することが安全なコードには不可欠です。$dom->doctypeDOMDocumentTypeオブジェクトを返すかどうかも、必ずif ($documentType instanceof DOMDocumentType)で確認してからプロパティにアクセスするようにしましょう。

PHP DOMDocumentType systemId を取得する

1<?php
2
3/**
4 * XMLドキュメントからDTD (Document Type Definition) の systemId を取得する関数。
5 * DOMDocumentType::systemId プロパティは、DTDの外部サブセットのURI(システム識別子)を返します。
6 *
7 * @param string $xmlString DTD宣言を含むXML文字列。
8 * @return string DTDのsystemId、またはDTDが存在しない場合のメッセージ。
9 */
10function getDocumentTypeSystemId(string $xmlString): string
11{
12    $dom = new DOMDocument();
13    // XMLをロードします。ここでは簡潔な例としてエラーハンドリングを省略しています。
14    // 実際のアプリケーションでは、loadXMLの戻り値をチェックし、エラーハンドリングを行うべきです。
15    $dom->loadXML($xmlString);
16
17    // ドキュメントタイプ (DTD) オブジェクトを取得します。
18    // DTDが定義されていない場合は null が返されます。
19    $docType = $dom->doctype;
20
21    if ($docType instanceof DOMDocumentType) {
22        // DOMDocumentType::systemId プロパティにアクセスして、システム識別子を取得します。
23        // systemIdは、外部のDTDファイルの場所を指すURIです。
24        // ここでは、キーワード 'systemd' を含む架空のURIをsystemIdとして使用するXMLの例を示しています。
25        $systemId = $docType->systemId;
26        return "検出されたDTD System ID: " . $systemId;
27    } else {
28        return "ドキュメントにDTD (Document Type Definition) が見つかりませんでした。";
29    }
30}
31
32// DTDにキーワード 'systemd' を含むSystem IDが指定されたXMLの例。
33// このsystemIdは、外部のDTDファイルを指定し、そのDTDファイルがドキュメントの構造を定義します。
34$xmlWithSystemId = <<<XML
35<!DOCTYPE config SYSTEM "http://example.com/systemd-services/config.dtd">
36<config>
37    <service name="webserver"/>
38</config>
39XML;
40
41// DTDが存在しないXMLの例。
42$xmlWithoutSystemId = <<<XML
43<data>
44    <item>Hello</item>
45</data>
46XML;
47
48// 関数を呼び出し、結果を出力します。
49echo getDocumentTypeSystemId($xmlWithSystemId) . PHP_EOL;
50echo getDocumentTypeSystemId($xmlWithoutSystemId) . PHP_EOL;
51

このPHPコードは、XMLドキュメントに含まれるDTD(Document Type Definition)のシステム識別子(systemId)を取得する方法を示しています。DOMDocumentType::systemIdプロパティは、XMLドキュメントが参照する外部DTDファイルのURIを文字列として返します。

コードでは、まずDOMDocumentクラスのloadXMLメソッドでXML文字列を読み込みます。その後、$dom->doctypeにアクセスして、ドキュメントタイプオブジェクト(DOMDocumentTypeのインスタンス)を取得します。XMLドキュメントにDTDが定義されていない場合、$dom->doctypenullを返します。

DOMDocumentTypeオブジェクトが正常に取得できた場合、そのsystemIdプロパティにアクセスすることで、外部DTDファイルのURIを取得できます。サンプルコードでは、"http://example.com/systemd-services/config.dtd"のように、キーワード「systemd」を含む架空のURIをsystemIdとして使用したXMLの例を提示しています。このsystemIdは、XMLドキュメントの構造を定義する外部DTDファイルの場所を特定する役割を持ちます。

getDocumentTypeSystemId関数は、DTD宣言を含むXML文字列を引数($xmlString)として受け取ります。そして、検出されたsystemIdの文字列、またはDTDが見つからなかった旨のメッセージを文字列として返します。このプロパティを利用することで、XMLドキュメントがどのような外部DTDを参照しているかをプログラム的に確認できるようになります。

このサンプルコードは、XMLのDTD(Document Type Definition)からsystemIdを取得する際の注意点を含んでいます。まず、DOMDocument::loadXML()はXMLのパースに失敗した場合にエラーを発生させますが、サンプルでは簡略化のためエラーハンドリングを省略しています。実際の運用では、不正なXMLデータに備え、必ず例外処理や戻り値の確認を行ってください。また、$dom->doctypeはDTDがXML内に存在しない場合にnullを返すため、instanceof DOMDocumentTypeによる型チェックは必須です。このチェックがないと、プロパティアクセス時にエラーが発生します。特に、systemIdはDTDの外部サブセットのURI(システム識別子)を指し、Linuxのサービス管理システムであるsystemdとは全く関係ありませんので混同しないでください。取得したsystemIdは外部リソースのURIであるため、これを利用して追加の処理を行う場合は、URLの検証やセキュリティ上のリスク(例:XXE攻撃の可能性など)に十分に配慮することが重要です。

関連コンテンツ

関連IT用語

関連プログラミング言語