【PHP8.x】notationsプロパティの使い方

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

作成日: 更新日:

基本的な使い方

notationsプロパティは、XMLドキュメント型定義(DTD)内で宣言された記法(notation)のリストを保持するプロパティです。

「記法」とは、XMLドキュメントが外部の非XMLデータ(例えば、画像ファイルやPDFファイルなど、XML形式ではないデータ)をどのように扱うかを定義するための仕組みです。DTDにおいてNOTATIONキーワードを使って宣言され、XMLパーサに対して、特定のデータ形式や、そのデータを処理するためのアプリケーションの種類などを識別させる情報を提供します。

このプロパティが返す値はDom\NamedNodeMapオブジェクトです。Dom\NamedNodeMapは、名前と値のペアで構成されるノードの集合を表し、ここでは各記法がDom\Notationオブジェクトとして格納されています。これにより、ドキュメントのDTDで定義されている全ての記法について、名前(Dom\NotationノードのnodeName)をキーとして、それぞれの記法に関する詳細情報(Dom\Notationオブジェクト)を取得できます。

システムエンジニアがXMLドキュメントを解析し、そのDTDで定義された記法情報をプログラム的に参照する必要がある場合に、このプロパティは非常に有用です。特に、XMLドキュメントが外部の非XMLリソースへの参照を含み、それらのリソースの種類や処理方法を特定するような複雑なデータ連携システムにおいて、正確なメタデータ取得のために活用されます。HTMLドキュメントには通常記法は含まれないため、このプロパティは主にXMLドキュメントの解析時にその真価を発揮します。

構文(syntax)

1<?php
2
3$xmlString = '<!DOCTYPE example [<!NOTATION myNotation PUBLIC "urn:publicid:myNotation">]><root/>';
4$document = new Dom\Document();
5$document->loadXML($xmlString);
6$documentType = $document->doctype;
7
8$notations = $documentType->notations;

引数(parameters)

引数なし

引数はありません

戻り値(return)

Dom\NamedNodeMap

このプロパティは、この文書型定義(DTD)で宣言されたすべての記法(notation)を表す Dom\NamedNodeMap オブジェクトを返します。Dom\NamedNodeMap は、名前によってアクセスできるノード(この場合は記法)のコレクションです。

サンプルコード

PHPでXMLのDOCTYPE表記を取得する

1<?php
2
3/**
4 * XMLドキュメントのDOCTYPEから表記(notations)を取得するサンプルコード。
5 *
6 * Dom\DocumentType::notationsプロパティは、XML DTD (Document Type Definition) で定義された
7 * NOTATION宣言のリスト(Dom\NamedNodeMap)を返します。
8 * これは、XMLデータ内で外部の非XMLデータ形式を参照するためのメタデータを提供します。
9 *
10 * 「php annotations」というキーワードは通常、PHPのDocBlockコメント内のメタデータを指しますが、
11 * この`notations`プロパティが扱うのはXML DTDにおける同様の付加情報(メタデータ)です。
12 * 概念的には異なりますが、「ある宣言に付随する追加情報」という点で関連性があります。
13 */
14function getXmlDocumentTypeNotations(): void
15{
16    // DTDにNOTATION宣言を含むXML文字列を作成
17    // NOTATIONは、XMLドキュメント内で外部の非XMLデータ形式(例: 画像フォーマット)を識別するために使用されます。
18    $xmlString = <<<XML
19<?xml version="1.0" encoding="UTF-8"?>
20<!DOCTYPE document [
21<!NOTATION gif-image SYSTEM "image/gif">
22<!NOTATION png-image SYSTEM "image/png">
23<!ELEMENT document (data)*>
24<!ELEMENT data EMPTY>
25<!ATTLIST data image NOTATION (gif-image | png-image) #REQUIRED>
26]>
27<document>
28    <data image="png-image"/>
29</document>
30XML;
31
32    $dom = new DOMDocument();
33    // DTDの検証を有効にしてXMLをロード。これにより、DOCTYPE内のNOTATIONが適切にパースされます。
34    $dom->validateOnParse = true;
35    $dom->loadXML($xmlString);
36
37    // ドキュメントタイプノードを取得
38    // Dom\DocumentType オブジェクトは、XMLのDOCTYPE宣言を表します。
39    $documentType = $dom->doctype;
40
41    if ($documentType instanceof Dom\DocumentType) {
42        echo "DOCTYPE名: " . $documentType->name . "\n";
43        echo "パブリックID: " . ($documentType->publicId ?: "なし") . "\n"; // DTDのPUBLIC IDが存在する場合
44        echo "システムID: " . ($documentType->systemId ?: "なし") . "\n";   // DTDのSYSTEM ID (URI)が存在する場合
45
46        // notationsプロパティにアクセスして、DTDで定義された表記のマップ(Dom\NamedNodeMap)を取得
47        $notations = $documentType->notations;
48
49        if ($notations->count() > 0) {
50            echo "\n検出された表記 (Notations):\n";
51            /**
52             * Dom\NamedNodeMap の各要素は Dom\Node であり、
53             * ここでは具体的に Dom\Notation オブジェクトとして扱われます。
54             */
55            foreach ($notations as $notation) {
56                // Dom\NotationはDom\Nodeを拡張し、publicIdとsystemIdプロパティを持ちます
57                if ($notation instanceof DOMNotation) {
58                    echo "- 名前: " . $notation->nodeName;
59                    echo ", パブリックID: " . ($notation->publicId ?: "なし");
60                    echo ", システムID: " . ($notation->systemId ?: "なし");
61                    echo "\n";
62                }
63            }
64        } else {
65            echo "\nDOCTYPEに表記(notations)は定義されていません。\n";
66        }
67    } else {
68        echo "DOCTYPEが定義されていないか、または取得できませんでした。\n";
69    }
70}
71
72// 関数の実行
73getXmlDocumentTypeNotations();

Dom\DocumentType::notationsプロパティは、XMLドキュメントのDOCTYPE宣言内で定義された表記(NOTATION)のリストを取得するために使用されます。XML DTD(Document Type Definition)におけるNOTATIONとは、XMLドキュメント内で外部の非XMLデータ形式(例えば、特定の画像フォーマットやオーディオフォーマットなど)を参照・識別するためのメタデータです。このプロパティは、これらのNOTATION宣言をDom\NamedNodeMapオブジェクトとして返します。Dom\NamedNodeMapは、名前によってNOTATION情報を取得できるコレクションであり、各要素はDom\Notationオブジェクトです。

サンプルコードでは、NOTATION宣言を含むXML文字列をDOMDocumentでロードし、そこからDom\DocumentTypeオブジェクトを取得しています。そして、$documentType->notationsにアクセスすることで、定義されたNOTATIONのリストを取得し、その名前やIDを表示しています。これにより、XML DTDに埋め込まれた外部参照の定義をプログラム的に確認できます。

「php annotations」というキーワードは、通常PHPコードのDocBlockコメント内のメタデータを指しますが、このnotationsプロパティが扱うのはXML DTDにおける同様の付加情報であり、技術的な実装は異なりますが、「ある宣言に付随する追加情報」という点で概念的な関連性があります。この機能は、複雑なXMLスキーマを解析する際に役立ちます。

XML DTDの表記(notations)を取得するには、XMLをロードする際に$dom->validateOnParse = true;を設定することが重要です。この設定がないと、DTDが正しくパースされず、表記情報を取得できません。また、XMLにDOCTYPE宣言がない、またはNOTATION宣言がない場合、notationsプロパティは空のDom\NamedNodeMapを返します。このDom\NamedNodeMapは通常の配列と異なり、count()で要素数をチェック後、foreachDom\Notationオブジェクトを扱います。

関連コンテンツ

関連プログラミング言語