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

【PHP8.x】DOMElement::schemaTypeInfoプロパティの使い方

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

作成日: 更新日:

基本的な使い方

schemaTypeInfoプロパティは、XMLドキュメント内の要素がXMLスキーマによって検証された際の型情報を保持するプロパティです。具体的には、このプロパティは、要素のスキーマ型情報を提供するDOMTypeInfoオブジェクト、またはスキーマ情報が存在しない場合にnullを保持します。

DOMElementは、XML文書内の個々の要素、すなわちタグで囲まれた部分を表すオブジェクトです。XMLスキーマは、XML文書の構造、内容、およびデータ型を定義するための言語であり、これによりXML文書のデータが正しい形式であるかを検証できます。

このschemaTypeInfoプロパティは、DOMElementがXMLスキーマ定義に従って検証された場合にのみ有効な情報を提供します。たとえば、XML文書をパースする際にDOMDocument::schemaValidate()メソッドなどを使用してスキーマ検証を実行すると、各DOMElementオブジェクトのこのプロパティに、その要素のデータ型に関する詳細な情報が格納されます。

これにより、アプリケーションは、XML文書から読み込んだデータが、事前に定義されたスキーマ型(例えば、整数型、日付型、文字列型など)に準拠しているかをプログラム的に確認し、より堅牢なデータ処理を行うことが可能になります。スキーマに基づいたデータの型チェックや変換処理を実装する際に特に役立ちます。

構文(syntax)

1<?php
2$element = new DOMElement('exampleTag');
3$typeInfo = $element->schemaTypeInfo;
4?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

DOMTypeInfo

DOMElementオブジェクトに関連付けられたXMLスキーマの型情報を取得します。この情報は、要素がどのXMLスキーマ型に準拠しているかを示します。

サンプルコード

PHP DOMElement schemaTypeInfo を取得する

1<?php
2
3/**
4 * DOMElement::schemaTypeInfo プロパティの使用例を示す関数。
5 * XMLスキーマに準拠するXMLドキュメントを解析し、要素のスキーマ型情報を取得します。
6 *
7 * DOMElement::schemaTypeInfo プロパティは、要素に適用されたXMLスキーマの型情報を
8 * DOMTypeInfo オブジェクトとして返します。
9 * このプロパティが有効であるためには、DOMDocument::schemaValidateSource()
10 * または DOMDocument::schemaValidate() を使って、ドキュメントにスキーマを適用し、
11 * 検証に成功している必要があります。
12 */
13function demonstrateSchemaTypeInfo(): void
14{
15    // 1. XMLスキーマを文字列で定義します。
16    // このスキーマは 'book' 要素とその子要素 'title', 'author', 'year' の型を定義します。
17    $xmlSchema = <<<EOT
18<?xml version="1.0" encoding="UTF-8"?>
19<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
20  <xs:element name="book">
21    <xs:complexType>
22      <xs:sequence>
23        <xs:element name="title" type="xs:string"/>
24        <xs:element name="author" type="xs:string"/>
25        <xs:element name="year" type="xs:integer"/>
26      </xs:sequence>
27    </xs:complexType>
28  </xs:element>
29</xs:schema>
30EOT;
31
32    // 2. スキーマに準拠するXMLドキュメントを文字列で定義します。
33    $xmlDocument = <<<EOT
34<?xml version="1.0" encoding="UTF-8"?>
35<book>
36  <title>PHP Programming Guide</title>
37  <author>PHP Expert</author>
38  <year>2023</year>
39</book>
40EOT;
41
42    // DOMDocument オブジェクトを作成します。
43    $dom = new DOMDocument();
44
45    // XMLドキュメントをロードします。
46    if (!$dom->loadXML($xmlDocument)) {
47        echo "エラー: XMLドキュメントのロードに失敗しました。\n";
48        return;
49    }
50
51    // XMLスキーマを適用し、ドキュメントを検証します。
52    // このステップが非常に重要です。schemaTypeInfo プロパティは、スキーマが適用されている場合にのみ
53    // 有効な DOMTypeInfo オブジェクトを返します。
54    if (!$dom->schemaValidateSource($xmlSchema)) {
55        echo "エラー: XMLスキーマ検証に失敗しました。schemaTypeInfo は利用できない可能性があります。\n";
56        // 詳細なエラー情報は libxml_get_errors() を使用して取得できます。
57        return;
58    }
59
60    echo "XMLドキュメントとスキーマは正常にロードされ、検証されました。\n\n";
61
62    // 3. 特定の DOMElement を取得し、そのスキーマ型情報を表示します。
63    // まず 'title' 要素の情報を取得します。
64    $titleElements = $dom->getElementsByTagName('title');
65    if ($titleElements->length > 0) {
66        $titleElement = $titleElements->item(0);
67
68        // DOMElement::schemaTypeInfo プロパティにアクセスします。
69        // これは DOMTypeInfo オブジェクト、またはスキーマ情報がない場合は null を返します。
70        $typeInfo = $titleElement->schemaTypeInfo;
71
72        if ($typeInfo instanceof DOMTypeInfo) {
73            echo "要素 '<{$titleElement->tagName}>' のスキーマ型情報:\n";
74            echo "  型名: {$typeInfo->typeName}\n"; // 要素のスキーマ型名 (例: string, integer)
75            echo "  型ネームスペース: " . ($typeInfo->typeNamespace ?: "(なし)") . "\n"; // 型が定義されているXMLスキーマのネームスペース
76
77            // 例: 型が 'xs:string' から派生しているかを確認します。
78            if ($typeInfo->isDerivedFrom('http://www.w3.org/2001/XMLSchema', 'string', DOM_TYPE_INFO_RESTRICTION)) {
79                echo "  備考: この型は 'xs:string' から制限によって派生しています。\n";
80            }
81        } else {
82            echo "要素 '<{$titleElement->tagName}>' のスキーマ型情報が見つかりませんでした。\n";
83        }
84    } else {
85        echo "'title' 要素が見つかりませんでした。\n";
86    }
87
88    echo "\n"; // 出力の区切り
89
90    // 次に 'year' 要素の情報を取得します。
91    $yearElements = $dom->getElementsByTagName('year');
92    if ($yearElements->length > 0) {
93        $yearElement = $yearElements->item(0);
94        $typeInfo = $yearElement->schemaTypeInfo;
95
96        if ($typeInfo instanceof DOMTypeInfo) {
97            echo "要素 '<{$yearElement->tagName}>' のスキーマ型情報:\n";
98            echo "  型名: {$typeInfo->typeName}\n";
99            echo "  型ネームスペース: " . ($typeInfo->typeNamespace ?: "(なし)") . "\n";
100
101            // 例: 型が 'xs:integer' から派生しているかを確認します。
102            if ($typeInfo->isDerivedFrom('http://www.w3.org/2001/XMLSchema', 'integer', DOM_TYPE_INFO_RESTRICTION)) {
103                echo "  備考: この型は 'xs:integer' から制限によって派生しています。\n";
104            }
105        } else {
106            echo "要素 '<{$yearElement->tagName}>' のスキーマ型情報が見つかりませんでした。\n";
107        }
108    } else {
109        echo "'year' 要素が見つかりませんでした。\n";
110    }
111}
112
113// 関数を実行します。
114demonstrateSchemaTypeInfo();
115
116?>

PHP 8のDOMElement::schemaTypeInfoプロパティは、XMLドキュメント内の特定の要素に適用されているXMLスキーマの型情報を取得するために使用されます。XMLスキーマは、XMLデータの構造とデータ型を定義するものです。このプロパティは引数を取らず、要素のスキーマ型情報をDOMTypeInfoオブジェクトとして返しますが、スキーマ情報が利用できない場合はnullを返します。このプロパティが有効に機能するためには、事前にDOMDocument::schemaValidateSource()DOMDocument::schemaValidate()メソッドを使って、ドキュメントにXMLスキーマを適用し、その検証に成功している必要があります。

サンプルコードでは、まずXMLスキーマとそれに準拠するXMLドキュメントを用意し、DOMDocumentにロードしてスキーマ検証を実行しています。検証が成功した後、特定の要素(例えばtitleyear)を取得し、schemaTypeInfoプロパティにアクセスすることで、その要素のスキーマ型(例えばxs:stringxs:integer)や型が定義されているネームスペースを取得し、表示しています。これにより、XMLデータがスキーマに沿って正しく構造化されているか、またそのデータの期待される型をプログラム的に確認できます。

DOMElement::schemaTypeInfoプロパティは、XMLドキュメントにXMLスキーマを適用し、検証に成功している場合にのみ要素のスキーマ型情報を返します。スキーマが適用されていない、または検証に失敗した場合はnullを返すため、プロパティの利用前には戻り値がDOMTypeInfoオブジェクトであるかを必ずinstanceofで確認してください。スキーマ検証の失敗時には、libxml_get_errors()関数で詳細なエラー情報を取得できますので、エラーハンドリングに活用してください。この機能はPHPのDOM拡張モジュールに依存しているため、実行環境で有効になっていることをご確認ください。

PHP DOMElement::schemaTypeInfo でXML型情報取得

1<?php
2
3/**
4 * XML ドキュメントの要素からスキーマ型情報を取得するサンプルコードです。
5 * この機能は、XMLスキーマによって定義された要素の型情報を取得するのに役立ちます。
6 * データベースの 'information_schema' がテーブルやカラムのメタデータを提供するように、
7 * XMLの DOMElement::schemaTypeInfo は要素の型に関するメタデータを提供します。
8 * PHP 8 の DOMElement::schemaTypeInfo プロパティを使用します。
9 */
10
11// 1. 検証に使用するXMLスキーマ (XSD) の定義
12// 'ItemType' という複合型を定義し、XML文書の 'item' 要素がこの型を持つようにします。
13$xsdContent = <<<XSD
14<?xml version="1.0" encoding="UTF-8"?>
15<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
16    <!-- ItemType: item 要素の構造を定義します -->
17    <xs:complexType name="ItemType">
18        <xs:sequence>
19            <xs:element name="description" type="xs:string"/>
20        </xs:sequence>
21        <xs:attribute name="id" type="xs:integer"/>
22        <xs:attribute name="name" type="xs:string"/>
23    </xs:complexType>
24
25    <!-- items 要素: 複数の item 要素を格納するコンテナとして定義します -->
26    <xs:element name="items">
27        <xs:complexType>
28            <xs:sequence>
29                <xs:element name="item" type="ItemType" maxOccurs="unbounded"/>
30            </xs:sequence>
31        </xs:complexType>
32    </xs:element>
33</xs:schema>
34XSD;
35
36// 2. スキーマで検証するXMLドキュメント
37// 上記XSDの 'ItemType' に従って定義された 'item' 要素を含みます。
38$xmlContent = <<<XML
39<?xml version="1.0" encoding="UTF-8"?>
40<items>
41    <item id="123" name="Sample Item">
42        <description>これはサンプルのアイテム説明です。</description>
43    </item>
44    <item id="456" name="Another Item">
45        <description>もう一つの説明です。</description>
46    </item>
47</items>
48XML;
49
50// スキーマファイルを一時的にシステムの一時ディレクトリに保存します。
51// これは単一のPHPスクリプトで完結させるための方法です。
52$xsdFile = tempnam(sys_get_temp_dir(), 'xsd');
53if ($xsdFile === false) {
54    exit("一時XSDファイルの作成に失敗しました。\n");
55}
56file_put_contents($xsdFile, $xsdContent);
57
58try {
59    // 3. DOMDocument オブジェクトを作成し、XMLを読み込みます。
60    $dom = new DOMDocument();
61    // スペースや改行を保持しない設定にし、出力時に整形するようにします(今回の出力には直接影響しません)。
62    $dom->preserveWhiteSpace = false;
63    $dom->formatOutput = true;
64    $dom->loadXML($xmlContent);
65
66    // 4. XMLドキュメントを定義したスキーマで検証します。
67    // 検証が成功すると、DOMノードにスキーマ定義に基づく型情報が付与されます。
68    if ($dom->schemaValidate($xsdFile)) {
69        echo "XMLドキュメントはスキーマに対して正常に検証されました。\n\n";
70
71        // 5. 特定のDOMElement (ここでは最初の 'item' 要素) を取得します。
72        $items = $dom->getElementsByTagName('item');
73        if ($items->count() > 0) {
74            $firstItem = $items->item(0);
75
76            echo "取得したXML要素名: " . $firstItem->nodeName . "\n";
77
78            // 6. DOMElement::schemaTypeInfo プロパティを使用して、
79            // この要素のスキーマ型情報を取得します。
80            // 戻り値は DOMTypeInfo オブジェクトです。
81            // このオブジェクトには、スキーマで定義された要素の型に関する詳細情報が含まれます。
82            if ($firstItem->schemaTypeInfo instanceof DOMTypeInfo) {
83                $typeInfo = $firstItem->schemaTypeInfo;
84
85                echo "要素のスキーマ型情報:\n";
86                // typeName: スキーマで定義された型の名前(例: 'ItemType')
87                echo "  型名 (typeName): " . ($typeInfo->typeName ?? 'N/A') . "\n";
88                // namespaceURI: 型が定義されている名前空間のURI
89                echo "  名前空間URI (namespaceURI): " . ($typeInfo->namespaceURI ?? 'N/A') . "\n";
90                // typeNamespace: 型が属する名前空間のURI (namespaceURI と同じ場合が多い)
91                echo "  型が定義された名前空間 (typeNamespace): " . ($typeInfo->typeNamespace ?? 'N/A') . "\n";
92                // その他、DOMTypeInfo には isDerivedFrom() などのメソッドもありますが、
93                // サンプルを簡潔にするため、ここでは主要なプロパティのみを表示します。
94            } else {
95                echo "この要素にはスキーマ型情報が利用できませんでした。\n";
96            }
97        } else {
98            echo "'item' 要素が見つかりませんでした。\n";
99        }
100    } else {
101        echo "XMLスキーマ検証に失敗しました。\n";
102        // 検証エラーの詳細を確認するには、libxml_get_errors() などの関数を使用できますが、
103        // 初心者向けの簡潔さを保つため、ここでは割愛します。
104    }
105} catch (Throwable $e) {
106    // 予期せぬエラーが発生した場合の処理
107    echo "エラーが発生しました: " . $e->getMessage() . "\n";
108} finally {
109    // スクリプト終了前に、作成した一時ファイルを削除します。
110    if (file_exists($xsdFile)) {
111        unlink($xsdFile);
112    }
113}

PHP 8で導入されたDOMElement::schemaTypeInfoプロパティは、XMLドキュメント内の特定の要素が持つスキーマ型情報を取得するために使用されます。このプロパティを利用するには、まずDOMDocument::schemaValidate()メソッドを使って、XMLドキュメントをXMLスキーマ(XSD)に対して正常に検証する必要があります。検証が成功すると、DOM要素にその型情報が関連付けられます。

データベースのinformation_schemaがテーブルやカラムの定義情報を提供するように、DOMElement::schemaTypeInfoはXML要素がどのような型として定義されているかのメタデータを提供します。例えば、XMLスキーマで「商品」という複合型を定義した場合、該当する「商品」要素からこのプロパティを使って「商品」という型名やその定義情報を取得できます。

このプロパティは引数を取らず、DOMTypeInfoオブジェクトを戻り値として返します。DOMTypeInfoオブジェクトからは、要素の型名(typeName)や型が定義されている名前空間URI(namespaceURI)など、詳細な型情報を確認することが可能です。これにより、XMLデータ処理において、要素の型に基づいた柔軟なプログラミングが可能になります。

DOMElement::schemaTypeInfoプロパティは、XMLドキュメントがXSDスキーマによって正常に検証された後にのみ、要素のスキーマ型情報を取得できる点に注意が必要です。検証が成功しない場合、このプロパティは期待する情報を提供しない可能性があります。プロパティはDOMTypeInfoオブジェクトを返し、そのtypeNameやnamespaceURIといったプロパティから、スキーマで定義された要素の具体的な型情報を確認できます。サンプルコードではXSDファイルを一時的に作成していますが、実際のアプリケーションでは、通常は既存のXSDファイルパスを直接指定して検証を行います。この機能は、XMLデータの構造がスキーマ定義に準拠しているかを確認し、その型情報をプログラムで利用する際に非常に重要です。

関連コンテンツ

関連IT用語

関連プログラミング言語