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

【PHP8.x】Dom\XMLDocument::schemaValidateSource()メソッドの使い方

schemaValidateSourceメソッドの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

schemaValidateSourceメソッドは、Dom\XMLDocumentオブジェクトのXMLドキュメントが、与えられたXMLスキーマ定義に準拠しているかを検証します。XMLスキーマは、XMLデータの形式と内容のルールを定義し、整合性を保証する仕組みです。このメソッドは、スキーマ定義をファイルパスではなく、文字列として直接受け取ります。

この機能は、プログラム内で生成したスキーマや、外部から取得したスキーマ文字列を用いてXMLドキュメントを検証したい場合に有効です。これにより、外部からのXMLデータが期待する構造に従っているかを確認し、不正なデータによるエラーを防ぎます。

検証結果はブール値で返され、成功すればtrue、失敗すればfalseです。検証失敗時はPHPの警告が発生しますが、エラーハンドリングで詳細なエラー情報を取得し、適切な処理ができます。

構文(syntax)

1<?php
2
3// Dom\XMLDocument のインスタンスを作成します。
4$document = new Dom\XMLDocument();
5
6// 検証対象となるXMLドキュメントをロードします。
7// schemaValidateSource メソッドを実行する前に、XMLドキュメントをロードしておく必要があります。
8$document->loadXML('<root><item>Hello PHP</item></root>');
9
10// 検証に使用するXSDスキーマの内容を文字列として定義します。
11$xsdSchemaContent = <<<EOT
12<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
13  <xs:element name="root">
14    <xs:complexType>
15      <xs:sequence>
16        <xs:element name="item" type="xs:string"/>
17      </xs:sequence>
18    </xs:complexType>
19  </xs:element>
20</xs:schema>
21EOT;
22
23// Dom\XMLDocument::schemaValidateSource メソッドを呼び出し、
24// ロードされたXMLをXSDスキーマ文字列に対して検証します。
25// 戻り値は検証が成功した場合は true、失敗した場合は false です。
26$isValid = $document->schemaValidateSource($xsdSchemaContent);
27
28?>

引数(parameters)

string $source, int $flags = 0

  • string $source: 検証に使用するXMLソースを指定する文字列
  • int $flags = 0: 検証の挙動を制御するためのフラグを指定する整数。デフォルトは0 (フラグなし)

戻り値(return)

bool

このメソッドは、XMLドキュメントが指定されたXMLスキーマに準拠しているかどうかを検証し、その結果を真偽値(bool)で返します。検証に成功した場合はtrueを、失敗した場合はfalseを返します。

サンプルコード

PHPでXMLをXSDスキーマで検証する

1<?php
2
3// 検証したいXMLデータ文字列
4$xmlString = <<<XML
5<?xml version="1.0" encoding="UTF-8"?>
6<bookstore>
7  <book category="cooking">
8    <title lang="en">Everyday Italian</title>
9    <author>Giada De Laurentiis</author>
10    <year>2005</year>
11    <price>30.00</price>
12  </book>
13  <book category="children">
14    <title lang="en">Harry Potter</title>
15    <author>J.K. Rowling</author>
16    <year>2005</year>
17    <price>29.99</price>
18  </book>
19</bookstore>
20XML;
21
22// 検証に使用するXMLスキーマ (XSD) データ文字列
23$xsdString = <<<XSD
24<?xml version="1.0" encoding="UTF-8"?>
25<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
26  <xs:element name="bookstore">
27    <xs:complexType>
28      <xs:sequence>
29        <xs:element name="book" maxOccurs="unbounded">
30          <xs:complexType>
31            <xs:sequence>
32              <xs:element name="title" type="xs:string"/>
33              <xs:element name="author" type="xs:string"/>
34              <xs:element name="year" type="xs:integer"/>
35              <xs:element name="price" type="xs:decimal"/>
36            </xs:sequence>
37            <xs:attribute name="category" type="xs:string"/>
38          </xs:complexType>
39        </xs:element>
40      </xs:sequence>
41    </xs:complexType>
42  </xs:element>
43</xs:schema>
44XSD;
45
46// Dom\XMLDocument オブジェクトを新規作成
47// PHP 8.3以降で利用可能です。
48$xmlDocument = new Dom\XMLDocument();
49
50// XML文字列をロード
51// ロードに失敗した場合、エラーメッセージを表示して終了します。
52if (!$xmlDocument->loadXML($xmlString)) {
53    echo "エラー: XMLデータのロードに失敗しました。\n";
54    exit;
55}
56
57// XMLスキーマ (XSD) に従ってXMLデータを検証
58// schemaValidateSource メソッドは、XSDスキーマの内容を文字列として直接受け取ります。
59$isValid = $xmlDocument->schemaValidateSource($xsdString);
60
61// 検証結果を出力
62if ($isValid) {
63    echo "XMLデータはXSDスキーマに準拠しています。\n";
64} else {
65    echo "XMLデータはXSDスキーマに準拠していません。\n";
66    // 準拠していない場合、libxml_use_internal_errors() と libxml_get_errors() を
67    // 使用して詳細なエラー情報を取得することもできます。
68}
69

PHP 8のDom\XMLDocument::schemaValidateSourceメソッドは、XMLデータがXMLスキーマ(XSD)の定義に準拠しているかをプログラムで確認するために利用されます。このメソッドを使用するには、まずDom\XMLDocumentオブジェクトを初期化し、検証したいXMLデータの文字列をloadXMLメソッドでオブジェクトにロードします。

次に、schemaValidateSourceメソッドを呼び出し、第一引数として検証に用いるXSDスキーマの内容を直接文字列で渡します。これにより、ロードされたXMLデータが渡されたXSDスキーマの構造やデータ型といったルールに従っているかをチェックします。このメソッドは、検証が成功しXMLデータがスキーマに準拠していればtrueを、準拠していなければfalseを戻り値として返します。第二引数のflagsは検証動作を調整するオプションですが、通常はデフォルト値で問題ありません。この機能は、外部から受け取ったXMLデータの妥当性を保証する際に非常に役立ちます。

Dom\XMLDocumentクラスはPHP 8.3以降で利用可能ですので、お使いのPHPのバージョンをご確認ください。まずloadXMLメソッドで検証したいXMLデータを読み込みますが、ロードに失敗するとスキーマ検証ができません。必ずロードの成否を確認し、エラー処理を行いましょう。schemaValidateSourceメソッドへは、XMLスキーマ(XSD)の内容全体を文字列として直接渡します。XSDファイルへのパスではありませんのでご注意ください。このメソッドがfalseを返した場合、XMLデータがスキーマに準拠していないことを意味します。より詳細なエラー情報は、libxml_use_internal_errors(true)libxml_get_errors()を組み合わせることで取得でき、問題の特定に役立ちます。

PHP: Dom\XMLDocument::schemaValidateSource でXMLを検証する

1<?php
2
3/**
4 * 指定されたXMLコンテンツが、提供されたXSDスキーマ文字列に準拠しているか検証します。
5 *
6 * @param string $xmlContent 検証対象のXMLデータを含む文字列。
7 * @param string $xsdSchema 検証に使用するXSDスキーマ定義を含む文字列。
8 * @return void 検証結果をコンソールに出力します。
9 */
10function validateXmlAgainstSchemaSource(string $xmlContent, string $xsdSchema): void
11{
12    // Dom\XMLDocument クラスの新しいインスタンスを作成します。
13    // このオブジェクトは、XMLドキュメントの操作とスキーマ検証に使用されます。
14    // 注意: PHP 8の標準DOM拡張では通常 'DOMDocument' クラスを使用しますが、
15    // ここでは提供されたリファレンス情報に基づき 'Dom\XMLDocument' を使用します。
16    $dom = new Dom\XMLDocument();
17
18    // 検証対象のXMLコンテンツをDom\XMLDocumentオブジェクトにロードします。
19    // ロードに失敗した場合(例: XMLの形式が不正な場合)は、エラーメッセージを表示して処理を終了します。
20    if (!$dom->loadXML($xmlContent)) {
21        echo "エラー: 提供されたXMLコンテンツのロードに失敗しました。\n";
22        return;
23    }
24
25    // libxml_use_internal_errors を有効にすることで、スキーマ検証中に発生したエラーが
26    // PHPのエラーログに直接出力される代わりに、内部バッファに格納されるようになります。
27    // これにより、libxml_get_errors() を使ってエラー情報を詳細に取得・表示できます。
28    libxml_use_internal_errors(true);
29
30    // schemaValidateSource メソッドを呼び出して、XMLコンテンツが提供されたXSDスキーマに準拠しているか検証します。
31    // 第1引数: 検証に使用するXSDスキーマ定義の文字列。
32    // 第2引数: フラグ (オプション、デフォルトは0)。ここでは特に指定しません。
33    // 戻り値: 検証に成功した場合は true、失敗した場合は false を返します。
34    $isValid = $dom->schemaValidateSource($xsdSchema);
35
36    // スキーマ検証後、libxml_use_internal_errors を元の設定に戻します。
37    libxml_use_internal_errors(false);
38
39    if ($isValid) {
40        echo "XMLコンテンツは提供されたスキーマに準拠しています。\n";
41    } else {
42        echo "XMLコンテンツは提供されたスキーマに準拠していません。\n";
43        echo "詳細なエラー情報:\n";
44        // libxml_get_errors() を使用して、内部バッファに格納された検証エラーを全て取得し、表示します。
45        foreach (libxml_get_errors() as $error) {
46            echo " - " . trim($error->message) . " (行: " . $error->line . ", 列: " . $error->column . ")\n";
47        }
48    }
49    // 次の検証に影響が出ないよう、libxmlのエラーバッファをクリアします。
50    libxml_clear_errors();
51}
52
53// --- サンプルデータの準備 ---
54
55// 1. 検証に使用するXSDスキーマ定義の文字列。
56// このスキーマは、ルート要素 'catalog' の中に、
57// 'book' 要素が複数含まれることを定義しています。
58// 各 'book' 要素は 'id' 属性 (必須、整数型) と 'title' 要素 (文字列型) を持ちます。
59$catalogSchema = <<<XSD
60<?xml version="1.0" encoding="UTF-8"?>
61<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
62    <xs:element name="catalog">
63        <xs:complexType>
64            <xs:sequence>
65                <xs:element name="book" maxOccurs="unbounded">
66                    <xs:complexType>
67                        <xs:sequence>
68                            <xs:element name="title" type="xs:string"/>
69                        </xs:sequence>
70                        <xs:attribute name="id" type="xs:integer" use="required"/>
71                    </xs:complexType>
72                </xs:element>
73            </xs:sequence>
74        </xs:complexType>
75    </xs:element>
76</xs:schema>
77XSD;
78
79// 2. スキーマに準拠する(正しい)XMLコンテンツの文字列。
80$validXmlContent = <<<XML
81<catalog>
82    <book id="1">
83        <title>The Hitchhiker's Guide to the Galaxy</title>
84    </book>
85    <book id="2">
86        <title>The Restaurant at the End of the Universe</title>
87    </book>
88</catalog>
89XML;
90
91// 3. スキーマに準拠しない(不正な)XMLコンテンツの文字列。
92// - 最初の 'book' 要素には必須の 'id' 属性がありません。
93// - 2番目の 'book' 要素の 'id' 属性は整数型ではなく文字列型です。
94$invalidXmlContent = <<<XML
95<catalog>
96    <book>
97        <title>Life, the Universe and Everything</title>
98    </book>
99    <book id="three">
100        <title>So Long, and Thanks for All the Fish</title>
101    </book>
102</catalog>
103XML;
104
105// --- 検証の実行 ---
106
107echo "--- 有効なXMLコンテンツとスキーマでの検証結果 ---\n";
108validateXmlAgainstSchemaSource($validXmlContent, $catalogSchema);
109echo "\n"; // 結果を見やすくするための改行
110
111echo "--- 無効なXMLコンテンツとスキーマでの検証結果 ---\n";
112validateXmlAgainstSchemaSource($invalidXmlContent, $catalogSchema);
113

Dom\XMLDocument::schemaValidateSourceメソッドは、PHPでXML(Extensible Markup Language)データが指定されたXSD(XML Schema Definition)スキーマに準拠しているかを検証するために使用されます。このメソッドを使うと、XMLコンテンツが特定の構造やデータ型ルールに従っているかを、プログラム上で確認できます。

引数としては、検証に使用するXSDスキーマの定義を文字列として渡します。2番目の引数 $flags はオプションで、通常は省略可能です。このメソッドは検証の結果をブール値で返し、XMLコンテンツがスキーマに完全に準拠していれば true を、そうでなければ false を返します。

サンプルコードでは、まず Dom\XMLDocument オブジェクトを作成し、検証したいXMLコンテンツをオブジェクトにロードします。次に、libxml_use_internal_errors(true) を設定して、検証中に発生したエラーをPHPの内部バッファに保持させます。その状態で schemaValidateSource メソッドを呼び出し、XMLコンテンツとXSDスキーマを照合します。検証結果が false の場合は、libxml_get_errors() を使って具体的なエラーメッセージを取得し、どの部分がスキーマに違反しているかを表示しています。この機能は、外部から受け取ったXMLデータの整合性を保証する際に非常に役立ちます。

Dom\XMLDocument::schemaValidateSourceメソッドは、事前にloadXMLでロードされたXMLドキュメントに対し、引数で渡されたXSDスキーマの文字列を用いて妥当性検証を行います。スキーマのファイルパスではなく、スキーマ定義そのものを文字列として渡す点が重要です。このメソッドは検証の成否を真偽値で返しますが、失敗時の具体的な原因を知るためにはlibxml_use_internal_errors(true)を呼び出し、libxml_get_errors()で詳細なエラー情報を取得する実装が不可欠です。検証処理後は、libxml_use_internal_errors(false)でエラーハンドリング設定を元に戻し、libxml_clear_errors()でエラーバッファをクリアし、他のXML処理に影響が出ないように徹底してください。

関連コンテンツ

関連IT用語

関連プログラミング言語