【PHP8.x】DOMEntity::publicIdプロパティの使い方
publicIdプロパティの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
publicIdプロパティは、XMLドキュメントのDTD(Document Type Definition)において、公開識別子(PUBLIC ID)の文字列を保持するプロパティです。このプロパティは、PHPのDOM拡張モジュールの一部であるDOMEntityクラスに属しています。
DOMEntityクラスは、XMLドキュメントの構造を定義するDTD内で宣言された、エンティティと呼ばれる特定の情報ブロックを表します。これには、外部から読み込まれるDTDファイルそのものや、特定の文字列に置き換えられる文字エンティティなどが含まれます。
publicIdプロパティは、特に外部DTDを特定する際に用いられる公開識別子を保持します。この識別子は、XMLパーサーが外部リソースを見つけるための手がかりとなるもので、リソースの場所(URLなど)を示すシステム識別子(SYSTEM ID)と合わせて使用されることがあります。これにより、ドキュメントが参照する外部定義を正確に識別し、処理することが可能になります。
このプロパティが保持する値は文字列型(string)であり、もし対応するPUBLIC識別子が定義されていない場合は空文字列("")を返します。publicIdプロパティは読み取り専用であり、一度DOMEntityオブジェクトが作成されると、その値をプログラムから変更することはできません。このプロパティは、XMLドキュメントのパースやバリデーションの際に、外部リソースの解決状況を確認したり、特定の外部定義に基づいて処理を分岐させたりする際に役立つ情報を提供します。
構文(syntax)
1<?php 2$xmlString = '<!DOCTYPE root [<!ENTITY example SYSTEM "http://example.com/example.dtd" PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN">]><root/>'; 3 4$dom = new DOMDocument(); 5$dom->loadXML($xmlString); 6 7$entity = $dom->doctype->entities->getNamedItem('example'); 8 9echo $entity->publicId;
引数(parameters)
引数なし
引数はありません
戻り値(return)
string
DOMEntityエンティティの公開識別子(publicId)を文字列で返します。
サンプルコード
PHP DOMEntityのpublicIdを取得する
1<?php 2 3/** 4 * DOMEntity クラスの publicId プロパティにアクセスするサンプルコード。 5 * 6 * publicId は外部エンティティの公開識別子(Public Identifier)を取得するために使用されます。 7 * このプロパティは「public」アクセス修飾子を持つため、クラスの外部から直接アクセス可能です。 8 * 9 * システムエンジニアを目指す初心者のために、XMLドキュメントのDTD(Document Type Definition)内に 10 * 定義されたエンティティから publicId を取得する具体的な例を示します。 11 */ 12 13// XML ドキュメントを文字列として定義します。 14// ここで、外部エンティティ 'example' を定義し、その PUBLIC 識別子を設定しています。 15$xmlString = <<<XML 16<?xml version="1.0" encoding="UTF-8"?> 17<!DOCTYPE doc [ 18 <!ENTITY example SYSTEM "http://example.com/example.dtd" PUBLIC "-//EXAMPLE//DTD Example Document V1.0//EN"> 19]> 20<doc> 21 <item>&example;</item> 22</doc> 23XML; 24 25// DOMDocument オブジェクトをインスタンス化します。 26// XML ドキュメントを操作するための主要なクラスです。 27$dom = new DOMDocument(); 28// XMLを読み込む際に、空白ノードを無視し、整形された出力を行う設定。 29$dom->preserveWhiteSpace = false; 30$dom->formatOutput = true; 31 32// XML 文字列を DOMDocument オブジェクトにロードします。 33// 失敗した場合はエラーメッセージを表示し終了します。 34if (!$dom->loadXML($xmlString)) { 35 echo "エラー: XMLのロードに失敗しました。\n"; 36 exit(1); 37} 38 39// ドキュメントの DOCTYPE (Document Type Definition) オブジェクトを取得します。 40// DOMDocumentType は DOMDocument のプロパティとしてアクセスできます。 41$doctype = $dom->doctype; 42 43if ($doctype !== null) { 44 echo "DOCTYPEが検出されました。\n"; 45 46 // DOCTYPE内に定義されているエンティティのマップ(集合)を取得します。 47 // entities プロパティは DOMNamedNodeMap オブジェクトを返します。 48 $entities = $doctype->entities; 49 50 if ($entities->length > 0) { 51 echo "エンティティが " . $entities->length . " 個見つかりました。\n"; 52 53 // 最初のエンティティ(DOMEntity オブジェクト)を取得します。 54 // item(0) はコレクションの最初の要素を取得します。 55 $firstEntity = $entities->item(0); 56 57 // 取得したノードが DOMEntity のインスタンスであることを確認します。 58 if ($firstEntity instanceof DOMEntity) { 59 echo "--- 最初のエンティティ情報 ---\n"; 60 echo "名前: " . $firstEntity->nodeName . "\n"; 61 62 // DOMEntity の publicId プロパティにアクセスします。 63 // このプロパティは外部エンティティの公開識別子(PUBLIC identifier)を返します。 64 // PHPのクラスにおける 'public' アクセス修飾子と同様に、直接アクセスが可能です。 65 $publicId = $firstEntity->publicId; 66 67 echo "Public ID: " . ($publicId === '' ? '(なし)' : $publicId) . "\n"; 68 69 // System ID も合わせて表示(参考情報として) 70 echo "System ID: " . ($firstEntity->systemId === '' ? '(なし)' : $firstEntity->systemId) . "\n"; 71 72 echo "--- 完了 ---\n"; 73 } else { 74 echo "エラー: 取得したノードは DOMEntity ではありません。\n"; 75 } 76 } else { 77 echo "DOCTYPE内にエンティティは定義されていません。\n"; 78 } 79} else { 80 echo "DOCTYPEは検出されませんでした。\n"; 81}
PHPのDOMEntityクラスのpublicIdプロパティについて説明します。このプロパティは、XMLドキュメントのDTD(Document Type Definition)内で定義された外部エンティティの公開識別子(Public Identifier)を取得するために使用されます。アクセス修飾子がpublicであるため、クラスの外部から直接アクセス可能です。引数はなく、常に文字列(string)型の公開識別子を返します。
提供されたサンプルコードでは、まずXML文字列をDOMDocumentクラスで読み込み、XML構造をメモリ上に構築します。次に、ロードされたXMLドキュメントのdoctypeプロパティからDOMDocumentTypeオブジェクトを取得します。このオブジェクトのentitiesプロパティを通じて、DTD内に定義されているエンティティのコレクションにアクセスし、特定のDOMEntityオブジェクトを取り出します。そして、そのDOMEntityオブジェクトのpublicIdプロパティを読み込むことで、DTDで定義されたエンティティの公開識別子「-//EXAMPLE//DTD Example Document V1.0//EN」を取得し、画面に表示しています。このpublicIdは、XMLが参照する外部リソースの標準的な識別子を確認する際に利用される重要な情報です。
DOMEntityのpublicIdプロパティは、XMLのDTD内でPUBLICキーワードを用いて定義された外部エンティティの公開識別子を取得します。PUBLIC識別子が設定されていない場合、このプロパティは空文字列を返しますので、取得後の値の確認が重要です。このプロパティはPHPのpublicアクセス修飾子を持つため、サンプルコードのようにオブジェクトから直接アクセスできます。private修飾子を持つプロパティとは異なり、追加のメソッドは不要です。コードを安全に利用するためには、XMLのDTDやエンティティの基本概念を理解し、XMLのロード失敗やエンティティが見つからないケースに対する堅実なエラーハンドリングの実装が不可欠です。
PHP DOMEntity::publicIdで外部エンティティの公開IDを取得する
1<?php 2 3/** 4 * DOMEntity::publicId プロパティの使用例 5 * 6 * この関数は、XML ドキュメントの DTD (Document Type Definition) に定義された 7 * 外部エンティティの PUBLIC ID (公開識別子) を取得する方法を示します。 8 * PUBLIC ID は、W3Cなどの標準化団体によって登録されたDTDやXMLスキーマなどの 9 * 公開されたリソースを一意に識別するための文字列です。 10 * 11 * DOMEntity::publicId は、PHPのクラスプロパティとして「public」に宣言されており、 12 * コードのどこからでも直接アクセスしてその値を取得できます。 13 */ 14function demonstrateDomEntityPublicId(): void 15{ 16 // XML ドキュメントを作成します。 17 // 外部エンティティを参照する DTD (Document Type Definition) を含めます。 18 // ここでは、"example" という名前のエンティティが PUBLIC ID を持っています。 19 // <!ENTITY example PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd"> 20 $xmlString = <<<XML 21<?xml version="1.0" encoding="UTF-8"?> 22<!DOCTYPE root [ 23 <!ENTITY example PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd"> 24 <!ENTITY localEntity "この内容はローカルエンティティです。"> 25]> 26<root> 27 <item>&example;</item> 28 <item>&localEntity;</item> 29</root> 30XML; 31 32 // DOMDocument オブジェクトを初期化し、XML を読み込みます。 33 // LIBXML_DTDLOAD: DTDをロードします。 34 // LIBXML_DTDATTR: DTD属性のデフォルト値を適用します。 35 $dom = new DOMDocument(); 36 if (!$dom->loadXML($xmlString, LIBXML_DTDLOAD | LIBXML_DTDATTR)) { 37 echo "エラー: XMLの読み込みに失敗しました。\n"; 38 return; 39 } 40 41 echo "XMLドキュメントが正常にロードされました。\n\n"; 42 43 // ドキュメントタイプ (DOCTYPE) ノードを取得します。 44 $docType = $dom->doctype; 45 46 if ($docType === null) { 47 echo "情報: ドキュメントに DOCTYPE が見つかりませんでした。\n"; 48 return; 49 } 50 51 echo "DOCTYPE名: " . $docType->name . "\n"; 52 echo "DOCTYPEのシステムID: " . ($docType->systemId ?: "(なし)") . "\n"; 53 echo "DOCTYPEの公開ID (Public ID): " . ($docType->publicId ?: "(なし)") . "\n\n"; 54 55 // DTDに定義されたエンティティのリストを取得します。 56 $entities = $docType->entities; 57 58 if ($entities->length === 0) { 59 echo "情報: DTDにエンティティが定義されていません。\n"; 60 return; 61 } 62 63 echo "=== 定義されたエンティティ情報 ===\n"; 64 foreach ($entities as $entity) { 65 if ($entity instanceof DOMEntity) { 66 echo "エンティティ名: " . $entity->nodeName . "\n"; 67 68 // DOMEntity::publicId は、外部エンティティの公開識別子 (PUBLIC ID) を文字列で返します。 69 // 外部エンティティでない場合(例: localEntity)は空文字列を返します。 70 echo " PUBLIC ID: " . ($entity->publicId ?: "(PUBLIC IDなし)") . "\n"; 71 echo " SYSTEM ID: " . ($entity->systemId ?: "(SYSTEM IDなし)") . "\n"; // 外部ファイルのURIなど 72 echo " Ndata記法名: " . ($entity->notationName ?: "(Ndata記法なし)") . "\n"; 73 echo " エンティティ内容: " . ($entity->nodeValue ?: "(内容なし)") . "\n"; 74 echo "\n"; 75 } 76 } 77} 78 79// 関数を実行して、DOMEntity::publicId の動作を確認します。 80demonstrateDomEntityPublicId(); 81
PHP 8のDOMEntity::publicIdは、XMLドキュメントのDTD(Document Type Definition)に定義された外部エンティティの公開識別子(PUBLIC ID)を取得するためのプロパティです。PUBLIC IDとは、HTMLのDTDなど、W3Cといった標準化団体が定めた公開リソースを一意に識別するために用いられる文字列で、特定のDTDやスキーマを参照していることを明示する役割を持ちます。
このpublicIdプロパティはDOMEntityクラスに属し、「public」と宣言されているため、コードのどこからでも$entity->publicIdのように直接アクセスして値を取得できます。引数はなく、戻り値はPUBLIC IDを表す文字列です。対象のエンティティが外部エンティティではない場合や、PUBLIC IDが定義されていない場合は空文字列を返します。
サンプルコードでは、外部エンティティ&example;を含むXMLを読み込み、そのDTDからエンティティ情報を取得しています。ループ処理で各エンティティのpublicIdプロパティにアクセスすることで、公開識別子「-//W3C//DTD HTML 4.01 Frameset//EN」が取得される様子を確認できます。このように、このプロパティはXMLがどのような外部リソースを参照しているかをプログラムで確認する際に非常に役立ちます。
DOMEntity::publicIdは、XMLのDTDで定義された外部エンティティの公開識別子を取得するプロパティです。ローカルエンティティでは空文字列が返されます。このプロパティにアクセスするためには、DOMDocument::loadXMLなどでLIBXML_DTDLOADオプションを指定し、DTDをロードすることが必須です。指定しないとエンティティ情報が正しく取得できません。プロパティはpublic宣言されており、$entity->publicIdのようにクラスの外部から直接アクセスして値を取得できます。取得値は文字列型ですが、常にPUBLIC IDが存在するとは限らないため、値の有無を確認する処理を加えるとより安全に利用できます。